我希望能够让我的订阅者处理两个不同的消息流。我期望每种消息类型都有一个MSMQ队列,但是我没有看到如何在我的.config文件的MsmqTransportConfig部分中指定多个InputQueue。
以下是我的订阅者的无XML配置:
Configure.With(new[] { typeof(EventMessage), typeof(EventMessageHandler), typeof(NServiceBus.Unicast.Transport.CompletionMessage) })
.CustomConfigurationSource(new UserConfigurationSource()
.Register(() => new MsmqTransportConfig { InputQueue = "Subscriber1InputQueue", ErrorQueue = "error", NumberOfWorkerThreads = 1, MaxRetries = 5 }))
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.UnicastBus()
.DoNotAutoSubscribe()
.LoadMessageHandlers()
.CreateBus()
.Start();
编辑:我似乎从不同的人那里得到了不同的答案。感谢大家!我想我的答案就是我的问题,那就是:使用NServiceBus(无论是发布者还是订阅者)的进程只能在SINGLE队列上接收消息。对我来说,这是一个不必要的限制,不幸的是NServiceBus以这种方式工作。我不希望有多个进程来接收消息,我不想让它们都进入同一个队列。如果特定消息处理程序出现问题,我希望只看到该特定消息类型的错误队列大小增加。我认为这样可以更好地了解系统中正在发生的事情。
答案 0 :(得分:3)
还没有使用no-xml配置,但是配置文件看起来像是:
<MsmqTransportConfig InputQueue="WorkerQueueForCurrentService" ErrorQueue="ErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/>
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="AssemblyName1" Endpoint="PublisherQueue1" />
<add Messages="AssemblyName2.Message1, AssemblyName2" Endpoint="PublisherQueue2" />
<add Messages="AssemblyName2.Message3, AssemblyName2" Endpoint="PublisherQueue2" />
</MessageEndpointMappings>
</UnicastBusConfig>
因此,当前服务的工作队列是“WorkerQueueForCurrentService”,并且它订阅在队列“PublisherQueue1”和“PublisherQueue2”上发布的不同消息。我已经包含了一个用于订阅整个消息组件的示例(请参阅添加消息行1)以及给定消息组合中的特定消息(请参阅添加消息第2行和第3行)。
Kristian kristensens的回答是不正确的。输入队列与使用nservicebus的每个服务相关。无论是发布者还是订阅者。发布者在输入队列上接收订阅通知,订阅者将输入队列设置为发送给发布者的订阅通知的目标队列。
如果你想以编程方式订阅像mrnye这样的消息说你需要一个messageendpointmapping。所以如果你做bus.subscribe nservicebus查看他的messageendpointmappings并尝试提取发布此消息的发布者队列名称。
messageendpointmappings用于两者:
- 查找哪些消息发布在哪里
和
- 发送消息的目标队列,您的bus.send()
希望这能解决一些问题: - )
答案 1 :(得分:1)
看看Publish/Subscribe Configuration。 InputQueue是为Publisher元素指定的,而不是为订阅者指定的。后者在UnicastBusConfig下添加了它对MessageEndpointMappings感兴趣的消息。如果您对两个不同的流感兴趣,只需在MessageEndpointMappings下添加元素。
答案 2 :(得分:1)
在NServiceBus中,所有消息都通过单个队列。它是队列之间的1:1映射:进程。因此,使用您的DoNotAutoSubscribe(),您只需手动订阅所需的消息,并使用app.config中的映射
例如,订阅使用配置后的函数_Bus.Subscribe<SomeMessage>();
我不记得消息映射的语法抱歉