NServiceBus 4.0 - 重复消息

时间:2014-03-11 19:31:08

标签: nservicebus nservicebus4

NServiceBus是否保证单个邮件不会被多个线程处理?

我一直在这个假设下工作,但似乎同时处理了一条消息两次。

我们在处理程序中执行一些非事务性操作,因此在配置中我们指定DoNotWrapHandlersExecutionInATransactionScope。这是否会影响NServiceBus确保邮件只处理一次的能力?据我所知,这只是它所说的并且没有用事务范围包装?

有人可以为我清楚吗? 还有什么可能导致重复的消息问题?

2 个答案:

答案 0 :(得分:1)

让我们说你的处理程序看起来像这样:

public class SomeCommandHandler : IHandleMessages<SomeCommnand>
{
    public void Handle(SomeCommnand message)
    {
        // write to the database and save changes

        throw new Exception("Oh noes!");
    }
}

如果您没有将您的处理程序包裹在TransactionScope中,我会猜测(因此请自行测试),您的数据将被写入但你的消息会被重试(理所当然,因为它失败了)。这会让你觉得你得到了两次消息。

但你为什么要做任何非交易的事情呢?这有点挫败了NServiceBus的目的。

如果您正在执行HTTP请求或其他长时间运行的事情以及您的基本数据库交互,那么您希望使用Saga,而不是简单的命令处理程序。 / p>

答案 1 :(得分:0)

关于

  

我们在处理程序中执行一些非事务性操作,因此在配置中我们指定了DoNotWrapHandlersExecutionInATransactionScope。

如果没有设置DoNotWrapHandlersExecutionInATransactionScope,您仍然可以在处理程序中执行非事务性事务。