抛出异常时如何从nservicebus处理程序发送回复?

时间:2011-03-04 14:58:55

标签: exception transactions nservicebus

我有一个服务(service1)从外部数据库读取数据。转换它并发送到队列。

第二个服务(service2)处理消息并处理它。处理失败时抛出异常并且NServiceBus重试5次以处理它(正常行为)但是永远不会发送回复。 :(

所有服务均适用于交易。

我的问题是: 如何在抛出异常时从处理程序向service1发送回复(或只发送不同的消息)?

我只想通知service1在service2上处理失败。

编辑1: 对于更具体的service1标记reeds外部数据库中的记录。需要进一步阅读其他数据。

我想将service2的响应返回给service1,它取消了那些抛出异常的记录。

从外部数据库读取数据的下一次迭代可能会再次记录此记录。

3 个答案:

答案 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();
                }
            }