在我的应用程序中,我正在尝试使用下一个代码订阅“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关闭原因,由...发起 Peer,code = 404,text =“NOT_FOUND - vhost'/'中没有队列'MyQueue', classId = 50,methodId = 20,cause =
虽然队列存在。
如果我删除.Declarations(false,false,false)并等待bus.Advanced.Topics.Subscribe(“MyQueue”);它将在RebusDirect交换中用兔子创建新的MyQueue并开始收听它。兔子的连接字符串是正确的。
问题出在哪里?配置不当或订阅方式不正确?
提前致谢。
答案 0 :(得分:0)
首先 - 如果你是专家Rebus和RabbitMQ用户,你应该只跳过自动声明的东西,并且你想要实现一些与众不同的东西。
Declarations
部分应该是.Declarations(true, true, true)
(或者只是省略,因为默认情况下总是确保自动声明交换,队列和绑定)。
接下来的事情 - 行
await bus.Advanced.Topics.Subscribe("MyQueue");
表示您感到困惑,因为MyQueue
是一个队列,但当您Subscribe
某事时,您订阅了一个主题。
“主题”基本上只是一个任意字符串,例如“thingamabob”。发布者可以使用该主题发布内容,如下所示:
await bus.Advanced.Topics.Publish("thingamabob", new GizmoDoodle());
然后将GizmoDoodle
消息传递给当前绑定到该主题的队列。
为了“绑定主题”,你
await bus.Advanced.Topics.Subscribe("thingamabob");
在RabbitMQ中建立绑定。
我建议你从一个干净的平板开始(不用任何方式定制Rebus对RabbitMQ的使用),然后去看看Rebus在RabbitMQ中创建的内容以使它工作。如果你还没有这样做,你肯定应该启用RabbitMQ Management Plugin。