NServiceBus是否保证单个邮件不会被多个线程处理?
我一直在这个假设下工作,但似乎同时处理了一条消息两次。
我们在处理程序中执行一些非事务性操作,因此在配置中我们指定DoNotWrapHandlersExecutionInATransactionScope
。这是否会影响NServiceBus确保邮件只处理一次的能力?据我所知,这只是它所说的并且没有用事务范围包装?
有人可以为我清楚吗? 还有什么可能导致重复的消息问题?
答案 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
,您仍然可以在处理程序中执行非事务性事务。