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

NServiceBus:如何让订阅者订阅多个消息类型(每个消息类型来自不同的队列),nservicebus,Nservicebus,我希望我的订户能够处理两个不同的消息流。我希望每种消息类型都有一个MSMQ队列,但我不知道如何在.config文件的MsmqTransportConfig部分中指定多个InputQueue 以下是我的订阅服务器的无XML配置: Configure.With(new[] { typeof(EventMessage), typeof(EventMessageHandler), typeof(NServiceBus.Unicast.Transport.CompletionMessage

我希望我的订户能够处理两个不同的消息流。我希望每种消息类型都有一个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的进程(无论是发布者还是订阅者)只能在单个队列上接收消息。对我来说,这是一个不必要的限制,不幸的是,NServiceBus就是这样工作的。我不希望有多个进程来接收消息,也不希望它们都进入同一个队列。如果某个特定消息处理程序有问题,我只希望看到该特定消息类型的错误队列的大小增加。我认为这样可以更好地了解系统中正在发生的事情。

看看。InputQueue是为发布者元素指定的,而不是为订阅服务器指定的。后者将感兴趣的消息添加到UnicastBusConfig下的MessageEndpointMappings中。如果您对两个不同的流感兴趣,只需在MessageEndpointMappings下添加元素。

在NServiceBus中,所有消息都通过一个队列。它是队列与进程之间的1:1映射。因此,使用DoNotAutoSubscribe(),您只需使用app.config中的映射手动订阅所需的消息

e、 例如,要订阅,请在配置后使用该函数

_Bus.Subscribe<SomeMessage>();
\u Bus.Subscribe();

我记不起消息映射的语法了。很抱歉,

还没有使用无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”上发布的不同消息。我提供了一个示例,用于订阅整个messageassembly(请参见添加消息第1行)和特定messageassembly中的特定消息(请参见添加消息第2行和第3行)

克里斯蒂安·克里斯滕森的回答是不正确的。输入队列与使用nservicebus的每个服务相关。不管它是发布者还是订阅者。发布服务器接收输入队列上的订阅通知,订阅服务器将输入队列设置为发送给发布服务器的订阅通知的目标队列

如果您想以编程方式订阅消息,如mrnye所说,您需要messageendpointmapping。因此,如果您执行bus.subscribe,nservicebus将查看其messageendpointmappings并尝试提取发布此消息的发布者队列名称

messageendpointmappings用于以下两种情况:
-在哪里发布哪些消息的查找

-通过总线发送消息的目标队列。send()


希望这能澄清一些问题:-)

我真的很困惑我一直在使用MsmqTransportConfig指定我的订阅者获取消息的方式。。。而且它有效!我已更新问题以反映我的配置。你能告诉我为什么这样做吗?现在我有另一个问题。为什么MessageEndPointMappings元素上没有“ErrorQueue”值?如果订阅服务器在处理消息时出现错误,它似乎不知道将其放置在何处。我所希望的是“MessageQueueA”、“MessageQueueB”、“MessageQueueC”和“ErrorQueueA”、“ErrorQueueB”、“ErrorQueueC”都对应于消息类型“TypeA”、“TypeB”、“TypeC”,这样,如果消息处理失败5次(由于订阅服务器上的错误),我就可以有另一个进程将消息从稍后将“ErrorQueue*”改为“MessageQueue*”。MessageEndpointMappings指定发布服务器的位置,以便订阅服务器知道向何处发送订阅消息。设置订阅后,发布服务器将向InputQueue(在您的示例“Subscriber1InputQueue”)中描述的端点发送已发布消息。如果处理此邮件失败,则该邮件将被移动到上面代码中指定的错误队列。这有意义吗?Skb-要实现单独的队列,您需要对每种邮件类型进行单独的处理。谢谢,hacktick。这确实澄清了问题。有一点我认为我不同意您所说的:messageendpointmappings用于。。。查找哪些消息在何处发布”。我认为这些实际上是进程想要订阅的端点/消息类型(自动或手动)。我认为这是因为我甚至没有为我的发布者或订阅服务定义它,因为我没有使用自动订阅机制,我使用我自己的ISubscriptionStorage实现。hi skb,“在何处发布消息的查找”指的是“如果我想订阅一条消息,我不订阅bus.subscribe(messagetype)nservicebus会查看此消息的发布位置。这样nservicebus就知道将订阅通知发送到哪里了。很抱歉定义不清楚。+1-这是一个很好的问题,也是我一直在努力解决的问题。