UnitOfWork 期间的意外行为
Unexpected behaviour during UnitOfWork
消息处理程序中的任何消息 send/publish 都将在提交事务时分派。 (这是一个非常好的 OOTB 行为)
我已经实现 UnitOfWork per your example. Discovered that if a exception occurred inside the action of OnCommitted(action)
the enqueued messages might get sent, it just depends if the deliver task 在 uow.commit()
操作之前执行。
我通过在接收管道末尾添加一个处理步骤找到了解决方法。它检查当前上下文中是否存在 uow,然后提交 uow。如果在提交期间发生 数据库架构更改 之类的异常,则它会在调用 OnCommitted 之前发生,并且不会调度任何排队的消息。
用 Rebus 实现 UnitOfWork 的正确方法是什么?
你能试试Rebus.UnitOfWork包,看看能不能用?
它为 Rebus 提供了重新设计的工作单元 API,您可以:
Configure.With(...)
.(...)
.Options(o => {
o.EnableUnitOfWork(Create, Commit);
})
其中 Create
和 Commit
可能是这样的:
public YourOwnUnitOfWork Create(IMessageContext context)
{
return new YourOwnUnitOfWork(...);
}
public void Commit(IMessageContext context, YourOwnUnitOfWork uow)
{
uow.Commit();
}
消息处理程序中的任何消息 send/publish 都将在提交事务时分派。 (这是一个非常好的 OOTB 行为)
我已经实现 UnitOfWork per your example. Discovered that if a exception occurred inside the action of OnCommitted(action)
the enqueued messages might get sent, it just depends if the deliver task 在 uow.commit()
操作之前执行。
我通过在接收管道末尾添加一个处理步骤找到了解决方法。它检查当前上下文中是否存在 uow,然后提交 uow。如果在提交期间发生 数据库架构更改 之类的异常,则它会在调用 OnCommitted 之前发生,并且不会调度任何排队的消息。
用 Rebus 实现 UnitOfWork 的正确方法是什么?
你能试试Rebus.UnitOfWork包,看看能不能用?
它为 Rebus 提供了重新设计的工作单元 API,您可以:
Configure.With(...)
.(...)
.Options(o => {
o.EnableUnitOfWork(Create, Commit);
})
其中 Create
和 Commit
可能是这样的:
public YourOwnUnitOfWork Create(IMessageContext context)
{
return new YourOwnUnitOfWork(...);
}
public void Commit(IMessageContext context, YourOwnUnitOfWork uow)
{
uow.Commit();
}