Exception 当引发异常时,如何从nservicebus处理程序发送回复?

Exception 当引发异常时,如何从nservicebus处理程序发送回复?,exception,transactions,nservicebus,Exception,Transactions,Nservicebus,我有一个从外部数据库读取数据的服务(service1)。将其转换并发送到队列 第二个服务(service2)处理消息并对其进行处理。处理失败时,会引发异常,NServiceBus会重试5次来处理它(正常行为),但不会发送回复:( 所有服务都在事务中工作 我的问题是: 当抛出异常时,如何从处理程序向service1发送回复(或只是发送不同的消息? 我只想通知service1 service2的处理失败 编辑1: 对于更具体的服务,1标记外部数据库中的reed记录。进一步读取其他数据时需要它 我想从

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

第二个服务(service2)处理消息并对其进行处理。处理失败时,会引发异常,NServiceBus会重试5次来处理它(正常行为),但不会发送回复:(

所有服务都在事务中工作

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

我只想通知service1 service2的处理失败

编辑1: 对于更具体的服务,1标记外部数据库中的reed记录。进一步读取其他数据时需要它

我想从service2返回对service1的响应,该响应将取消标记引发异常的记录

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

Bus.Reply()从不使用的原因是它是同一事务的一部分。一个选项是让某些人查看错误队列,并将消息推回原始发件人

另一个选项是在传输中点击FailedMessageProcessing事件。这样做的缺点是,您不知道失败的是什么,只知道失败的是什么。它还将报告可能不需要的每次重试

在这种情况下,您可能真的需要同步请求/响应,因此NSB可能根本不是您所需要的。如果您提供有关业务案例的更多详细信息,我们可能会提供更多建议。

原因总线。Reply()一个选择是让某些人查看错误队列,并将消息推回到发起人

另一个选项是在传输中点击FailedMessageProcessing事件。这样做的缺点是,您不知道失败的是什么,只知道失败的是什么。它还将报告可能不需要的每次重试


在这种情况下,您可能真的需要同步请求/响应,因此NSB可能根本不是您所需要的。如果您就业务案例向我们提供更多详细信息,我们可能会提供更多建议。

您可以始终包装总线。回复而不是自己的事务范围,例如:

using (var scope = new TransactionScope(TransactionScopeOptions.RequiresNew))
{
    Bus.Reply(your message here)
    scope.Complete();
}

这会将由于错误而执行的事务与导致错误的事务分开。

您始终可以包装总线。回复而不是它自己的事务范围,例如:

using (var scope = new TransactionScope(TransactionScopeOptions.RequiresNew))
{
    Bus.Reply(your message here)
    scope.Complete();
}

这会将由于错误而执行的事务与导致错误的事务分开。

正如Jonathan Oliver的增强功能一样,在try-catch块之后使用finally块环绕using语句,如下所示

            finally
            {
                using (var scope = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    Bus.Reply<MyResponseObject>(reply);
                    scope.Complete();
                }
            }
最后
{
使用(var scope=new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew))
{
答复(答复);;
scope.Complete();
}
}

就像对Jonathan Oliver的增强一样,在try-catch块之后用finally块包围using语句,如下所示

            finally
            {
                using (var scope = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    Bus.Reply<MyResponseObject>(reply);
                    scope.Complete();
                }
            }
最后
{
使用(var scope=new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew))
{
答复(答复);;
scope.Complete();
}
}
“Bus.Reply()永远不会出现的原因是它是同一事务的一部分。”-这也是我的想法。我不需要同步通信。也许捕获异常并返回正确的错误代码对我来说就足够了。我不需要重试,但我的“重试”将通过下一次从外部数据库读取数据的迭代得到保证。“Bus.Reply()从未成功的原因是它是同一事务的一部分。”-这也是我的想法。我不需要同步通信。也许捕获异常并返回正确的错误代码对我来说就足够了。我不需要重试,但我的“重试”将由下一次从外部数据库读取数据的迭代来保证。