Что происходит, когда мое приложение потребляет сообщение MSMQ, но затем терпит неудачу?


Если я попрошу Боба принести мне сэндвич, а Боб скажет "Хорошо", но потом его собьет автобус на обратном пути из магазина, я никогда не получу свой сэндвич-и я не знаю, что я не получу свой сэндвич!-- поэтому я никому не говорю: "Эй, я голоден!"

Есть ли способ решить эту проблему в MSMQ? Могу ли я зарезервировать сообщение, чтобы оно не передавалось никому другому, но Не потребляло его, чтобы я мог вернуть его в очередь позже, если я подавлюсь им?

Я даже не знаю. как бы это назвать. : /

Уточнение: я использую транзакционную очередь. Но если потребитель получает сообщение (и сообщение удаляется), что происходит, когда этот потребитель не может сделать то, о чем его просит сообщение? Является ли единственным вариантом, чтобы потребитель поставил его обратно в очередь?

2 3

2 ответа:

Это называется "семантикой точного времени" и довольно трудно достижимо для любого распределенного процесса; это не специфично для MSMQ.

Типичный способ справиться с этим - использовать скользящее окно доставки; скажите Бобу: "Передай мне сэндвич до 1 часа дня или забудь об этом". Затем, если у вас нет сэндвича к часу дня, скажите Клэр: "Дай мне сэндвич до двух часов дня или забудь об этом". Если Боб спешит обратно с вашим бутербродом и видит, что уже после часа дня, он должен решить, что делать с бутербродом, но он не может отдам его тебе.

На самом деле существует довольно много исследований на эту тему; Google "ровно один раз". Я вижу, Microsoft утверждает, что MSMQ поддерживает его через MQMgmtGetInfo.

Итак, я наконец нашел ответ: вы можете использовать транзакции на вызове Receive() так же, как и на вызове Send(). Затем вы можете прервать транзакцию, и она будет откатана, оставив сообщение в очереди (при условии, конечно, что вы используете транзакционную очередь).

Я действительно нашел этот ответ на StackOverflow (MSMQ receive with transaction-rollback not making message available again ), но заданный там вопрос был совершенно другим, так что это было не все легко найти.

Я оставляю этот вопрос на всякий случай, если семантика более точно соответствует чьему-то поиску в Google.