2

我有一个 Rebus Servicebus 控制台应用程序在我的测试环境中作为 Windows 服务运行。服务总线是这样创建的:

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();

应用程序设置如下所示:

<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 发送消息 -> 保存到特定数据库

向 service2 发送消息 -> 保存到另一个数据库

实际发生的情况:

将消息发送到 service1 -> service1 AND service2 将它们拾取并保存在两个数据库中。

有人可以指出我正确的方向吗?:)

4

2 回答 2

1

我能够使用虚拟主机(vhost)解决它

在 RabbitMQ 中,我添加了两个虚拟主机 bus1 和 bus2,然后我允许我的用户使用它们。

然后我将连接字符串更改为这个,它就像一个魅力:)

<add key="RabbitMQ.Url" value="amqp://busUser2:password@localhost/bus2"/>

于 2015-07-07T08:27:09.830 回答
1

从您的问题中不清楚您bus.Send是消息还是bus.Publish消息 - 但由于您正在调用ManageSubscriptions()您的配置,我假设后者......?

Rebus 有两种发送消息的基本方式——bus.Send当你打算让一个特定的收件人接收消息时,你可以,或者bus.Publish当你基本上不关心谁得到它时你可以:)(你当然关心,但你让关系的订阅者端是bus.Subscribe对消息类型足够关心的那个)。

在您的情况下,在我看来您想要这样做bus.Send(yourMessage),然后,在发件人的中,您通过将类型映射到 来app.config指定谁拥有消息类型myFirstQueue

我希望这是有道理的 :) 你不应该为了让这个工作而搞乱虚拟主机和各种时髦的 Rabbit 设置,它应该很容易做到,不需要任何额外的配置。

于 2015-07-07T14:27:21.423 回答