【问题标题】:Subscribing rabbitmq queue via Rebus 2通过 Rebus 2 订阅 rabbitmq 队列
【发布时间】:2016-12-01 11:17:24
【问题描述】:

在我的应用程序中,我正在尝试根据您使用下一个代码的建议在“Rebus”主题交换中订阅“MyQueue”队列,该队列已绑定到它:

    async void InitializeBus()
    {

    var busConfigurer = Configure.With(new CastleWindsorContainerAdapter(_container))
            .Logging(l => l.Log4Net())
            .Transport(t => t.UseRabbitMq(_connectionString, "MyQueue")
                .Declarations(false, false, false)
                    .ExchangeNames("RebusDirect", "Rebus")
                        .Prefetch(5))
            .Options(o => {
                o.SimpleRetryStrategy(_errorQueue);
                if (_enableLegacyCompatibility)
                {
                    o.EnableLegacyCompatibility();
                }
            })
            .Serialization(s => s.Decorate(c => new XmlMessageSerializer()));

        var bus = busConfigurer.Start();`
        await bus.Advanced.Topics.Subscribe("MyQueue");
    }

结果我有一个例外

AMQP 操作被中断:AMQP 关闭原因,由 对等体,code=404,text="NOT_FOUND - vhost '/' 中没有队列 'MyQueue'", classId=50, methodId=20, cause=

虽然队列存在。

如果我删除 .Declarations(false, false, false) 并等待 bus.Advanced.Topics.Subscribe("MyQ​​ueue");它将在 RebusDirect 交换中的 rabbit 中创建新的 MyQueue 并开始收听它。 rabbit的连接字符串是正确的。

问题可能出在哪里?配置不当还是订阅方式不正确?

提前致谢。

【问题讨论】:

    标签: rabbitmq rebus


    【解决方案1】:

    第一件事 - 如果您是 Rebus 和 RabbitMQ 专家用户并且想要实现一些不寻常的事情,您可能应该只跳过自动声明。

    Declarations 部分应该是.Declarations(true, true, true)(或者干脆省略,因为默认始终确保自动声明交换、队列和绑定)。

    接下来的事情——生产线

    await bus.Advanced.Topics.Subscribe("MyQueue");
    

    表示你在混淆事物,因为MyQueue是一个队列,但是当你Subscribe某事物时,你订阅了一个TOPIC。

    “主题”基本上只是一个任意字符串,例如“东西”。发布者可以使用该主题发布内容,如下所示:

    await bus.Advanced.Topics.Publish("thingamabob", new GizmoDoodle());
    

    然后GizmoDoodle 消息传递到当前绑定到该主题的队列

    为了“绑定话题”,你

    await bus.Advanced.Topics.Subscribe("thingamabob");
    

    在 RabbitMQ 中建立绑定。

    我建议您从头开始(无需以任何方式自定义 Rebus 对 RabbitMQ 的使用)并查看 Rebus 在 RabbitMQ 中创建了什么以使其工作。如果你还没有这样做,你绝对应该去启用RabbitMQ Management Plugin

    【讨论】:

    • 可能我没有抓住你的意思,但如果我不想存档一些非凡的东西。我一直在使用 Rebus 1,现在切换到 2 版本。我的目标是继续应用程序中已经存在的消息传递方式。如果我删除.Declarations(false, false, false),它将在 RebusDirect 交换中的 rabbit 中创建新的 MyQueue 并开始收听它。我只需要让我的应用程序在 Rabbit 中侦听现有队列,该队列在现有主题交换中具有绑定并调用现有 IHandleMessages
    • 您想要实现的目标非常非凡,绝对不受支持(但您知道 :))而且我什至不确定它是否可能(您也知道)...当您删除Declarations 行并使用Rebus/RebusDirect 交换?
    • 如果我的问题看起来很奇怪,请原谅,但在我的情况下,不要破坏现有逻辑而是享受新的 rebus 异步方法非常重要。正如我所提到的,如果我删除.Declarations(false, false, false),它将在 RebusDirect 交换中的 rabbit 中创建新的 MyQueue 并开始收听它。其原因是我从 rebus 代码中看到的 RabbitMqTransport,因为它通过直接交换 .... model.QueueBind(address, this._directExchangeName, address);.... 建立与队列的绑定。我现有的设置路由键的交换是主题。
    • 据我所知,唯一缺少的绑定是 Rebus 1 期望从 MyQueue 主题到队列 @9​​87654337@ 的绑定 - 我相信 await bus.Advanced.Topics.Subscribe("MyQueue") 确定了这一点
    • 问题在于消息中缺少消息头。以前版本的 RabbitMQTransport 无法处理它,正如我们在 github 上讨论的那样,问题已在您奇妙的最新版本传输中解决)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多