1

NServiceBus 是否保证一条消息不被多个线程处理?

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

我们在处理程序中做了一些非事务性的事情,所以在我们的配置中我们指定DoNotWrapHandlersExecutionInATransactionScope. 这会影响 NServiceBus 确保消息只处理一次的能力吗?据我了解,这正是它所说的并且不包含事务范围?

有人可以帮我解决这个问题吗?还有什么可能导致重复消息问题?

4

2 回答 2

1

假设您的处理程序看起来像这样:

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

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

如果您没有将处理程序包装在 a 中TransactionScope,我(所以请自行测试),您的数据将被写入,但您的消息将被重试(理所当然,因为它失败了)。这会给你的印象是你收到了两次消息。

但是你为什么要做任何非交易性的事情呢?这有点违背 NServiceBus 的目的。

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

于 2014-03-15T19:08:22.637 回答
0

关于

我们在处理程序中做了一些非事务性的事情,所以在我们的配置中我们指定了 DoNotWrapHandlersExecutionInATransactionScope。

您仍然可以在处理程序中执行非事务性操作,而无需设置DoNotWrapHandlersExecutionInATransactionScope.

于 2014-03-16T01:36:12.397 回答