NServicebus - 一个端点多个处理程序线程

时间:2014-12-24 08:22:00

标签: c# multithreading handler nservicebus

我有两个端点。

端点1:

  • HandlerForMessage X
  • HandlerForMessage Y
  • HandlerForMessage Z

网络端点:   - 此时没有处理程序,只需向总线发送命令。

发生以下情况:

  1. 网络 - >发送和LT; MessageX>(..);
  2. 端点1:接收MessageX
  3. 端点1:处理MessageX并处理Handler Bus.Send< MessageY>()和Bus.Send< MessageZ>()
  4. 端点1:接收MessageY,处理它(这需要20秒)
  5. 端点1:20秒后,处理完MessageY后,接收MessageZ并处理它。
  6. 自MessageY以来,MessageZ有不同的处理程序,这不可能同时完成吗?

    创建另一个端点或将其移动到另一个端点不是一种选择。我只是希望它在涉及不同类型的消息(和处理程序)时是多线程的。我不明白为什么这不是默认行为。

    如何配置nservicebus从不同类型(使用不同的处理程序)同时处理多条消息?

    NServiceBus 4.6.5(或者如果我需要升级到5,很好我不介意。只是想让它多线程)。 传输:SqlServer和另一个项目Windows Azure Service Bus

2 个答案:

答案 0 :(得分:2)

除非自我开始使用NServiceBus后发生变化,"unlicenced"版本只运行1个工作线程,因此它一次只处理1条消息。

您可以通过更改传输上的NumberOfWorkerThreads值来更改配置中的此值,但是您需要有效的许可才能将数字增加到1以上。

<MsmqTransportConfig MaxRetries="0" NumberOfWorkerThreads="1" />

在NServiceBus v4中,您需要在MaximumConcurrencyLevel上配置TransportConfig值:

<TransportConfig MaximumConcurrencyLevel="5" 
                 MaxRetries="2" 
                 MaximumMessageThroughputPerSecond="0"/>

请参阅Failure handling & throttling

答案 1 :(得分:0)

如果我的方案正确无误,那么这是一个单一的交易/工作单元......

Web端点向端点发送消息调用所有消息,并从该处理程序调度所有后续消息...因此即使端点可以是多线程的,它们也都是相同的序列化交易,所以如果我没有错,他们将是顺序的...

如果您不想运行多个端点,请查看描述在同一进程中运行多个端点的此问题:https://github.com/Particular/NServiceBus/issues/1357

这有帮助吗?