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);
        });
}