我有一个服务(service1)从外部数据库读取数据。转换它并发送到队列。
第二个服务(service2)处理消息并处理它。处理失败时抛出异常并且NServiceBus重试5次以处理它(正常行为)但是永远不会发送回复。 :(
所有服务均适用于交易。
我的问题是: 如何在抛出异常时从处理程序向service1发送回复(或只发送不同的消息)?
我只想通知service1在service2上处理失败。
编辑1: 对于更具体的service1标记reeds外部数据库中的记录。需要进一步阅读其他数据。
我想将service2的响应返回给service1,它取消了那些抛出异常的记录。
从外部数据库读取数据的下一次迭代可能会再次记录此记录。
答案 0 :(得分:5)
你总是可以包裹Bus.Reply而不是它自己的TransactionScope,例如:
using (var scope = new TransactionScope(TransactionScopeOptions.RequiresNew))
{
Bus.Reply(your message here)
scope.Complete();
}
这会将因错误导致您执行的事务与导致错误的事务分开。
答案 1 :(得分:0)
Bus.Reply()从未做过的原因是它是同一个事务的一部分。一种选择是查看错误队列并将消息推送回发起者。
另一种选择是利用传输中的FailedMessageProcessing事件。这样做的缺点是你不会知道什么是失败的,只是有些事情失败了。它还将报告每次重试,这可能是不可取的。
可能是您真的需要同步请求/响应,因此NSB可能根本不是您需要的。如果您就业务案例提供更多详细信息,我们可能会提供更多建议。
答案 2 :(得分:0)
就像Jonathan Oliver的增强一样,在你的try-catch块之后用finally语句包围using语句
finally
{
using (var scope = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew))
{
Bus.Reply<MyResponseObject>(reply);
scope.Complete();
}
}