我们正在实施一个使用NServiceBus调用其他服务的传奇。我不太清楚NServiceBus如何处理传奇中的异常。
在saga中我们有一个处理程序,该处理程序调用一个外部服务,只有在原始消息处理程序成功完成后才能调用该服务。可以这样做:
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基础结构时,它会在事务端点上回滚事务,导致消息返回到队列,用户代码尝试发送或发布的任何消息将被撤消以及。
非常感谢任何帮助澄清这一点。
答案 0 :(得分:3)
只要您从您的传奇中进行消息传递而不进行任何Web服务调用,那么您就是安全的 - 无需执行SendLocal。