Определите, будет ли сообщение повторено из контекста наблюдателя в MassTransit 3 - PullRequest
0 голосов
/ 08 октября 2018

Я бы хотел отследить количество повторных попыток и повторных доставок сообщений при использовании MassTransit 3. У меня настроены как повторные попытки, так и повторные доставки:

config.UseDelayedRedelivery(r => r.Immediate(2));
config.UseRetry(r => r.Immediate(3));

Я настроил IConsumeObserver и a IReceiveObserver как описано здесь .И я могу проверить ConsumeContext / ReceiveContext в PostConsume<T>(ConsumeContext<T> context) / PostReceive(ReceiveContext context).

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

Как в PostConsume методе IConsumeObserver или IReceiveObserver определить, представляет ли context сообщение, которое будет доставлено илитот, который успешно завершен?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы можете сделать это.MassTransit сохраняет количество повторных поставок в заголовках сообщений, в противном случае он не будет знать, когда прекратить повторную доставку, в соответствии с вашей политикой.

Если эта строка возвращает ненулевое значение (или не нулевое, я не уверен,) - вы имеете дело с доставленным сообщением.

context.Headers.Get(MessageHeaders.RedeliveryCount, default(int?)));

Если ваше сообщение повторяется (не доставлено), проверьте ответ от Криса: Получить количество повторных попыток сообщения MassTransit

0 голосов
/ 09 октября 2018

Потребитель может влиять на то, будет ли сообщение доставлено, но оно не имеет полного контроля или знания о нем.Например, все успешно выполняется на стороне потребителя, но это занимает слишком много времени, издатель повторяет попытку, и у потребителя нет простого способа узнать, что это произойдет.

Часто лучше спроектировать приложение так, чтобымногократное использование одного и того же сообщения имеет тот же эффект, что и одноразовое использование.

Кроме того, вы проверяете MessageId на потребление сообщения, если хотите узнать, использовали ли вы его раньше.

ConsumeContext также имеет RetryCount, но я не верю , он увеличивается до следующего запуска потребителя.

...