【问题标题】:MassTransit and RabbitMQ, make queue survive restart when using DIMassTransit 和 RabbitMQ,使队列在使用 DI 时重新启动
【发布时间】:2017-05-13 18:51:37
【问题描述】:

我正在尝试强制 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;
    }
});

那么队列是持久的,但服务重启时不会创建。

我们如何为每个消费者指定一个队列名称?

【问题讨论】:

  • 队列是按端点创建的。没有什么能阻止您为每个消费者拥有一个端点。你的容器是什么? MassTransit 支持几乎所有存在的容器。
  • 正确。我们正在使用 Unity,我们希望创建队列,将它们命名为 server1name_MessageType1、server1name_MessageType2、server2name_MessageType1、server2name_MessageType2,并使队列不会被删除并允许它们存储消息,直到它们成为消费者
  • 接收端点队列、交换和绑定永远不会被删除。我假设你明白了我的意思,看看你的答案。
  • 实际上队列正在被删除

标签: c# rabbitmq servicebus masstransit


【解决方案1】:

解决了这个问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多