我在我的测试环境中运行了一个作为Windows服务运行的Rebus Servicebus控制台应用程序。 servicebus的创建方式如下:
Bus = Configure.With(adapter)
.Logging(l => l.Log4Net())
.Transport(
t => t.UseRabbitMq(ConfigurationManager.AppSettings["RabbitMQ.Url"],
ConfigurationManager.AppSettings["RabbitMQ.Queue"],
ConfigurationManager.AppSettings["RabbitMQ.ErrorQueue"])
.ManageSubscriptions())
.MessageOwnership(d => d.FromRebusConfigurationSection())
.Sagas(s => s.Use(new RavenDbSagaPersister(sagaDocumentStore)))
.Timeouts(t => t.Use(new RavenDbTimeoutStorage(sagaDocumentStore)))
.CreateBus().Start();
appsettings看起来像这样:
<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="myFirstQueue"/>
<add key="RabbitMQ.ErrorQueue" value="myFirstQueue.error" />
你可以看到它与RabbitMQ @localhost交谈。
到目前为止这么好,这就像一个魅力。
但是,我们需要在同一台服务器上设置另一个Servicebus实例(它是一个测试服务器,我们有多个分支机构),现在我遇到了一些问题。
第二个实例的appsettings如下所示:
<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="mySecondQueue"/>
<add key="RabbitMQ.ErrorQueue" value="mySecondQueue.error" />
当我开始向第一个服务发送消息时,我可以看到它们也被第二个服务接收,我认为这是因为他们正在使用相同的RabbitMQ实例@localhost?
我不是服务总线的专家,我认为只使用不同的队列就可以解决这个问题,但事实并非如此。
我已经阅读了有关虚拟主机的内容,这是要走的路吗?
我想做什么:
向service1发送消息 - &gt;保存到特定数据库
向service2发送消息 - &gt;保存到另一个数据库
实际发生的事情:
向service1发送消息 - &gt; service1 AND service2选择它们并保存在两个数据库中。
有人可以指出我正确的方向吗? :)
答案 0 :(得分:1)
我能够使用虚拟主机(vhost)解决它
在RabbitMQ中,我添加了两个虚拟主机bus1和bus2,然后我授权用户使用它们。
然后我将connectionstring更改为this,它就像魅力一样:)
<add key="RabbitMQ.Url" value="amqp://busUser2:password@localhost/bus2"/>
答案 1 :(得分:1)
从您的问题中不清楚您是bus.Send
消息还是bus.Publish
消息 - 但是因为您在配置中调用ManageSubscriptions()
,我会假设后者......?
Rebus有两种发送消息的基本方式 - 当你打算发送消息时,可以bus.Send
,特定收件人可以获取消息,或者当你基本上不关心谁得到消息时你可以bus.Publish
:)(你做当然要小心,但你让关系的订阅者结束了对bus.Subscribe
到消息类型足够深切的关系。)
在您的情况下,我觉得您想要bus.Send(yourMessage)
,然后在发件人的app.config
中,您通过将类型映射到myFirstQueue
来指定who owns the message type。
我希望它有意义:)你不需要乱搞虚拟主机和各种时髦的Rabbit设置以使这项工作,它应该很容易做到没有任何额外的配置。