2017-02-03 2 views
1

Мы используем ребус и Sqs для обмена сообщениями. Мы также настроили в каждой очереди политику Redrive, перемещающую сообщения в очередь DeadLetter после 3 попыток. У нас есть много обработчиков обработки однотипные сообщений:Rebus Как узнать, какие обработчики имеют успех и что вызвало исключение, когда сообщение улавливается несколькими обработчиками

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"); 
    } 
} 

поведения здесь является то, что ребус ликвидирует Handling трубопровода после выходит из строя первого обработчика. Мы используем очередь очереди. Когда обработчик вызывает исключение, сообщение отправляется в очередь с ошибкой (ожидаемое поведение). Дело в том, что мы хотим отслеживать, какие обработчики обработали сообщение и какие обработчики не избегают одного и того же обработчика для обработки сообщения дважды после того, как сообщение переработано из очереди DeadLetter.

ответ

1

Если ваши обработчики могут работать успешно или сбой индивидуально, и они не каким-то образом зачислены в транзакцию, которая может быть отброшена на исключениях (например, как SqlTransaction, разделяемая всеми обработчиками), вы не должны полагаться на конвейер обработчика сообщений do «делать несколько вещей» для одного сообщения.

Возможно, вы получите MessageX в обработчике, который отправляет два сообщения самому себе, таким образом используя индивидуальные сообщения для каждой вещи, которая должна быть выполнена.

Смежные вопросы