我们正在实现一个传奇,使用NServiceBus调用其他服务。我不太清楚NServiceBus如何处理传奇中的异常。

在传奇中,我们有一个处理程序,该处理程序调用一个外部服务,该服务仅在原始消息处理程序成功完成后才被调用。可以这样做吗?

public void Handle(IFooMessage message)
{
    var message = Bus.CreateInstance<ExternalService.IBarMessage>();
    Bus.Send(message);

    // something bad happens here, exception is thrown
}

还是将消息多次发送到ExternalService?这里有人建议将其更改为:
// handler in the saga
public void Handle(IFooMessage message)
{
    // Do something
    var message = Bus.CreateInstance<ISendBarMessage>();
    Bus.SendLocal(message);

    // something bad happens, exception is thrown
}

// a service-level handler
public void Handle(ISendBarMessage message)
{
    var message = Bus.CreateInstance<ExternalService.IBarMessage>();
    Bus.Send(message);
}

我做了一个实验,从我可以看出的第一种方法看来还不错,但是除了http://docs.particular.net/nservicebus/errors/之外,我找不到任何其他文档:

当异常冒泡进入NServiceBus基础结构时,它会在事务终结点上回滚事务,从而使消息返回到队列,并且以及用户代码尝试发送或发布的所有消息都将被撤消,也是如此。

任何澄清这一点的帮助将不胜感激。

最佳答案

只要您正在从传奇中进行消息传递并且不进行任何Web服务调用,那么您就很安全-无需执行SendLocal。

10-05 20:32
查看更多