MassTransit 和 RabbitMQ,使用 DI 时使队列在重启时存活
MassTransit and RabbitMQ, make queue survive restart when using DI
我正在尝试强制 RabbitMQ 队列在 Rabbit 服务重启后继续存在,同时强制它们在服务重启完成后重新使用相同的名称。
我们正在使用我们的 DI 容器来传递消息消费者
return new List<Type>
{
typeof(Consumer1), typeof(Consumer2), typeof(Consumer3), typeof(Consumer4)
};
然后通过
将该集合传递给配置
t => _kernel.Get(t));
然后这样注册
cfg.ReceiveEndpoint(host, e =>
{
foreach (var type in consumerTypes)
{
e.Consumer(type, getConsumer);
}
});
这使得队列在每次重新启动时重新创建,名称中带有 GUID。
如果我们尝试这样做:
cfg.ReceiveEndpoint(host, e =>
{
foreach (var type in consumerTypes)
{
e.Consumer(type, getConsumer);
e.Durable = true;
e.AutoDelete = false;
}
});
那么队列是持久的,但不会在服务重启时创建。
我们如何为每个消费者指定一个队列名称?
解决了这个问题:
foreach (var type in consumerTypes)
{
var consumerType = type;
var queueName = string.Format("{0}_{1}",
Environment.MachineName, consumerType.ToString());
cfg.ReceiveEndpoint(host, queueName,
e =>
{
e.Consumer(consumerType, getConsumer);
});
}
我正在尝试强制 RabbitMQ 队列在 Rabbit 服务重启后继续存在,同时强制它们在服务重启完成后重新使用相同的名称。
我们正在使用我们的 DI 容器来传递消息消费者
return new List<Type>
{
typeof(Consumer1), typeof(Consumer2), typeof(Consumer3), typeof(Consumer4)
};
然后通过
将该集合传递给配置t => _kernel.Get(t));
然后这样注册
cfg.ReceiveEndpoint(host, e =>
{
foreach (var type in consumerTypes)
{
e.Consumer(type, getConsumer);
}
});
这使得队列在每次重新启动时重新创建,名称中带有 GUID。
如果我们尝试这样做:
cfg.ReceiveEndpoint(host, e =>
{
foreach (var type in consumerTypes)
{
e.Consumer(type, getConsumer);
e.Durable = true;
e.AutoDelete = false;
}
});
那么队列是持久的,但不会在服务重启时创建。
我们如何为每个消费者指定一个队列名称?
解决了这个问题:
foreach (var type in consumerTypes)
{
var consumerType = type;
var queueName = string.Format("{0}_{1}",
Environment.MachineName, consumerType.ToString());
cfg.ReceiveEndpoint(host, queueName,
e =>
{
e.Consumer(consumerType, getConsumer);
});
}