【问题标题】:Rebus How to know what handlers have success and what have raised an exception when a message is catched by multiple handlersRebus 当消息被多个处理程序捕获时,如何知道哪些处理程序成功以及哪些引发了异常
【发布时间】:2017-02-03 09:48:19
【问题描述】:

我们使用 rebus 和 Sqs 进行消息传递。我们还在每个队列上配置了 Redrive 策略,在 3 次重试后将消息移动到 DeadLetter 队列。 我们有许多处理相同消息类型的处理程序:

public class MessageHandlerA : IHandleMessages<MessageX>
{
    public async Task Handle(MessageX message)
    {
        Console.WriteLine("HandlerA is about of failing");
        throw new FileLoadException();
    }
}

public class MessageHandlerB : IHandleMessages<MessageX>
{
    public async Task Handle(MessageX message)
    {
        Console.WriteLine("HandlerB finished Ok");
    }
}

这里的行为是 rebus 在第一个处理程序失败后中止处理管道。 我们正在使用死信队列。当处理程序引发异常时,消息将进入死信队列(预期行为)。这里的事情是我们想要跟踪哪些处理程序已经处理了消息,哪些处理程序没有处理,以避免在从死信队列重新处理消息后,同一个处理程序处理消息两次。

【问题讨论】:

    标签: rebus


    【解决方案1】:

    如果您的处理程序可以单独成功/失败,并且它们没有以某种方式加入到可以在异常情况下回滚的事务中(例如,像所有处理程序共享的SqlTransaction),您不应该依赖消息处理程序管道为一条消息做“多件事”。

    您可能应该在一个向自己发送两条消息的处理程序中收到您的MessageX,这样每件应该完成的事情都使用单独的消息。

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      相关资源
      最近更新 更多