NServiceBus UnitOfWork吞下某些异常并避免消息失败

Dav*_*ike 0 nservicebus unit-of-work

我有一个有趣的用例,其中某些异常类型意味着"此消息不再有效且应该被忽略"但是此代码没有任何意识,Bus以便调用Bus.DoNotContinueDispatchingCurrentMessageToHandlers().

我讨厌像每个消息处理程序中都需要的try/catch块这样的样板代码.所以我开始实现一个UnitOfWork来处理和吞下异常,但我找不到告诉框架的方法"是的,这个代码生成了一个异常,但忘记了这一点,只是完成了事务."

Bus.DoNotContinueDispatchingCurrentMessageToHandlers()不起作用.我尝试过ITransport注入和调用,AbortHandlingCurrentMessage()但这导致整个宇宙爆炸.即使单步执行源代码,我似乎也不知所措.

请注意,很可能这是一个可怕的想法,因为假设实际上存在异常情况时没有异常将导致事务提交,从而导致谁知道有多少不良的未知副作用.因此,最好有一个方法仍然回滚事务但丢弃该消息.但我会对潜在的"是的我知道我在做什么,提交交易而不管异常"选项感兴趣.

And*_*und 5

从NServiceBus版本4.4开始,您可以通过向我们的处理程序管道中注入一个行为来控制它.

这让你控制哪些例外静音.

class MyExceptionFilteringBehavior : IBehavior<HandlerInvocationContext>
{
    public void Invoke(HandlerInvocationContext context, Action next)
    {
        try
        {
            //invoke the handler/rest of the pipeline
            next();
        }
        //catch specific exceptions or
        catch (Exception ex)
        {
            //modify this to your liking
            if (ex.Message == "Lets filter on this text")
                return;

            throw;
        }
    }
Run Code Online (Sandbox Code Playgroud)

有几个样本如何工作:

http://docs.particular.net/samples/pipeline/

这就是说我完全同意拉蒙的观点,只有当你不能改变设计以避免这种情况时才应该使用这个技巧.