Удаление сообщения из очереди, только если пользователь выполняет какую-либо операцию

StackOverflow https://stackoverflow.com/questions/1370096

  •  21-09-2019
  •  | 
  •  

Вопрос

У нас есть приложение MVC, которое считывает данные из MSMQ.Мы пытаемся найти способ прочитать сообщение из очереди и удалить его из очереди, только если пользователь выполнил успешную операцию в очереди.Сообщение должно оставаться в очереди до тех пор, пока пользователь не завершит обработку. Сообщение не должно быть доступно никому другому, пока пользователь, обрабатывающий объект сообщения, не завершит операцию.

Существует ли свойство для объекта «Сообщение», которое можно установить как «Просмотренное», которое не позволит снова прочитать это сообщение до тех пор, пока оно не будет возвращено в очередь или не удалено из очереди?

Мы не уверены, будет ли использование MSMQ хорошей идеей в данном случае?

Это было полезно?

Решение

Похоже, вам нужно использовать очереди в транзакционном режиме.Затем ваш клиент может получить сообщение, обработать его и затем зафиксируйте транзакцию, после чего сообщение будет окончательно исключено из очереди.Однако пока транзакция активна, другие клиенты не увидят сообщение — оно будет храниться в резерве до тех пор, пока транзакция не завершится или не будет прервана.

В этой статье MSDN содержится достойный обзор шаблонов использования для надежного обмена сообщениями с помощью MSMQ:

http://msdn.microsoft.com/en-us/library/ms978430.aspx

Другие советы

Очередь — правильная идея.Ваш подход «оставить его в очереди заблокированным, но все же доступным» неверен.

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

  1. Процесс A ставит что-то в очередь 1

  2. Процесс B выходит из очереди 1 и начинает работу.

    • Если Б добьется успеха, то все.

    • В противном случае он помещается в другую очередь (возможно, в ту же очередь или, возможно, в очередь 2) для последующей работы.

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

Очередь — это не база данных: в ней нет ничего с состоянием (нет «не смотри на меня, меня обрабатывают»).

Очередь — это временное хранилище.Кто-то пишет, кто-то читает, и всё.


Если вам нужна надежность, прочтите это: http://msdn.microsoft.com/en-us/library/ms978430.aspx

И это: http://blogs.msdn.com/shycohen/archive/2006/02/20/535717.aspx

И это: http://www.request-response.com/blog/PermaLink,guid,03fb0e40-b446-42b5-ad90-3be9b0260cb5.aspx

Надежность — это особенность очереди, а не вашего приложения.Вы можете выполнить «восстанавливаемое чтение».Это транзакция, являющаяся частью API очереди.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top