NServiceBus:如何让订阅者订阅多个消息类型(每个消息类型来自不同的队列)

时间:2010-12-03 20:35:00

标签: nservicebus

我希望能够让我的订阅者处理两个不同的消息流。我期望每种消息类型都有一个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以这种方式工作。我不希望有多个进程来接收消息,我不想让它们都进入同一个队列。如果特定消息处理程序出现问题,我希望只看到该特定消息类型的错误队列大小增加。我认为这样可以更好地了解系统中正在发生的事情。

3 个答案:

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

我不记得消息映射的语法抱歉