通过Rebus 2订阅rabbitmq



在我的应用程序中,我正在尝试订阅"MyQueue"队列,该队列在"Rebus"主题交换中与之绑定,基于您的建议,使用下一个代码:

    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=

尽管存在队列。

如果我删除.声明(false,false,false)并等待总线。高级。主题。订阅("MyQueue");它将在RebusDirect交换中的rabbit中创建新的MyQueue并开始侦听它。到rabbit的连接字符串是正确的。

问题可能在哪里?配置不正确或订阅方式不正确?

提前谢谢。

首先,如果您是Rebus和RabbitMQ的专家用户,并且您想要实现一些不同寻常的东西,那么您可能只应该跳过自动声明。

在那里,Declarations部分可能是.Declarations(true, true, true)(或者简单地忽略掉,因为默认情况是始终确保自动声明交换、队列和绑定)。

下一件事-线

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

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

"主题"基本上只是一个任意的字符串,例如"thingamabob"。出版商可以使用这样的主题发布内容:

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

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

为了"绑定到主题",

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

其在RabbitMQ中建立绑定。

我建议您从头开始(不要以任何方式自定义Rebus对RabbitMQ的使用),然后去看看Rebus在RabbitMQ中创建了什么来使其发挥作用。如果您还没有这样做,那么您肯定应该启用RabbitMQ管理插件。

最新更新