2015-04-27 3 views
3

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

Я хочу, чтобы иметь возможность хранить информацию о состоянии обработки где-то в IConsumeContext<MyMessage>, которая будет связана с каждым конкретным сообщением, так что, например, если обработка сообщения завершится с ошибкой на шаге 2, на следующей попытке я продолжу с шага 2, а не повторять шаг 1 снова.

Возможно ли это?

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

Также есть сообщение Headers, но я не уверен, для чего это.

Кто-нибудь сделал это раньше?

UPDATE:

Я мог бы просто использовать try/catch блоки с петлями и задержать там внутри тоже, но я не знаю, если это было бы лучше, чтобы избежать этого.

ответ

2

Лучший способ справиться с чем-то подобным - это сага через Automatonymous. Сделайте повторные попытки явным и частью вашего домена.

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

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