2009-08-21 3 views
1

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

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

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

Какие еще варианты мне не хватает? Я рад принять, что существует совершенно другое решение этой проблемы.

ответ

4

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

+0

Ничего себе сам человек - спасибо! Я не могу использовать сагу, о которой я не думаю. Существует только одно сообщение, и перед его обработкой ему нужны некоторые данные в базе данных. На самом деле нет двух сообщений, которые я могу собрать в саге, данные создаются старой хранимой процедурой, я использую NSB для добавления дополнительных данных, которые ссылаются на нее. –

+0

Затем используйте тайм-аут в саге, чтобы проверить, имеются ли данные в базе данных - он предоставит вам простой механизм опроса; нет данных, запросите другой тайм-аут. –