NServiceBus 是否保证一条消息不被多个线程处理?
我一直在这种假设下工作,但是似乎一条消息同时处理了两次。
我们在处理程序中做了一些非事务性的事情,所以在我们的配置中我们指定DoNotWrapHandlersExecutionInATransactionScope
. 这会影响 NServiceBus 确保消息只处理一次的能力吗?据我了解,这正是它所说的并且不包含事务范围?
有人可以帮我解决这个问题吗?还有什么可能导致重复消息问题?
NServiceBus 是否保证一条消息不被多个线程处理?
我一直在这种假设下工作,但是似乎一条消息同时处理了两次。
我们在处理程序中做了一些非事务性的事情,所以在我们的配置中我们指定DoNotWrapHandlersExecutionInATransactionScope
. 这会影响 NServiceBus 确保消息只处理一次的能力吗?据我了解,这正是它所说的并且不包含事务范围?
有人可以帮我解决这个问题吗?还有什么可能导致重复消息问题?
假设您的处理程序看起来像这样:
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,而不是简单的命令处理程序。
关于
我们在处理程序中做了一些非事务性的事情,所以在我们的配置中我们指定了 DoNotWrapHandlersExecutionInATransactionScope。
您仍然可以在处理程序中执行非事务性操作,而无需设置DoNotWrapHandlersExecutionInATransactionScope
.