C# NServiceBus可恢复性失败时发送消息

C# NServiceBus可恢复性失败时发送消息,c#,nservicebus,C#,Nservicebus,当且仅当可恢复性执行的所有重试都失败时,是否有方法向NServiceBus发送消息?简而言之,我想向另一个队列发送一条新消息(同时将其发送到错误队列)。我不确定是否,或者如何,我可以插入管道来完成这项工作 我有一个下面的行为,当我抛出一个特定的异常时,它通过向NServiceBus发送一个事件(绕过重试)来处理它,但我有另一个用例,在这个用例中,我只想在重试失败后发送相同的事件 class OperationFailedExceptionBehavior : Behavior<IIncom

当且仅当可恢复性执行的所有重试都失败时,是否有方法向NServiceBus发送消息?简而言之,我想向另一个队列发送一条新消息(同时将其发送到错误队列)。我不确定是否,或者如何,我可以插入管道来完成这项工作

我有一个下面的行为,当我抛出一个特定的异常时,它通过向NServiceBus发送一个事件(绕过重试)来处理它,但我有另一个用例,在这个用例中,我只想在重试失败后发送相同的事件

class OperationFailedExceptionBehavior : Behavior<IIncomingLogicalMessageContext>
{
    public override async Task Invoke(IIncomingLogicalMessageContext context, Func<Task> next)
    {
        try
        {
            await next().ConfigureAwait(false);
        }
        catch (OperationFailedException ex)
        {
            //since we're catching the exception, retries will no longer occur.
            await context.Publish(new OperationFailedEvent(ex));
        }
    }
}
类操作FailedExceptionBehavior:行为
{
公共重写异步任务调用(IIncomingLogicalMessageContext上下文,Func next)
{
尝试
{
wait next().configurewait(false);
}
捕捉(操作失败异常例外)
{
//由于我们正在捕获异常,将不再进行重试。
等待上下文发布(新操作失败事件(ex));
}
}
}

您可能正在寻找通知。您可以订阅错误通知,我认为这将为您提供实现上述需求所需的所有详细信息


有关更多详细信息:

我研究了这种可能性,但事件参数不会在任何允许我发送另一条消息的上下文中传递。我的示例代码获取一个IIncomingLogicalMessageContext,然后我可以调用它来发布。我没有在MessageSentToErrorQueue事件处理程序上获得该(或任何其他上下文)参数。延迟重试次数存储在头
头中。延迟重试次数
,立即重试次数应存储在
立即重试次数
头中。但我不确定最后一条消息。让我澄清一下:您是否有兴趣将失败消息移动到错误队列中?因为如果是这种情况,那么当消息失败时(即使是最后一次失败),传入消息事务总是回滚,任何传出消息都不会被发送。您可以从通知处理程序使用
IMessageSession
接口,消息将立即发送。我根本不想更改错误队列行为。我希望它仍然在错误队列中结束。当原始命令失败时(重试后),我尝试向管道中添加一个额外的发布命令。例如,如果重试失败而整个命令失败,我想向新队列发送一个新事件,该事件将导致向失败的用户发送一条消息。现在,当消息进入错误队列时,无法通知请求用户失败(通过NServiceBus)。完美。通知是您需要的。要在处理通知时发送/发布消息,只需使用
IMessageSession
界面即可。当发送其他消息时,当传入消息失败时,您不想使用消息上下文,因为您不想参与传入消息事务。