在我的应用程序中,我正在尝试订阅"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管理插件。