2014-01-15 4 views
0

Текущей настройка включает в себя обслуживание окон, которые подхватывают сообщение из локальной очереди и извлекает информацию, и помещает в свой SQL database.According к моей конструкцииОбработка отравляют сообщения в MSMQ

  1. служба подбирает сообщение из очереди. (Я использую Peek() здесь).
  2. Отправляет его в базу данных.
  3. Если по какой-то причине я получаю исключение, сохраняя его в базе данных, сообщение возвращается в очередь, что для меня является надежным.
  4. Я регистрирую ошибки, чтобы пользователь мог узнать, в чем проблема, и исправить ее.

Пример исключения: Если соединение DBconnection теряется при сохранении сообщений в базе данных, тогда сообщения не теряются, поскольку они находятся в очереди. Я не комментирую, пока не получаю подтверждение от БД, что сообщение вставлено. Таким образом, пользователь может видеть журналы и убедиться, что DBconnection существует, и все будет нормально, и мы не потеряем никаких сообщений в очереди.

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

Глядя на удаление сообщения: На данный момент, если я иду на основе исключения формата ... тогда я могу ошибаться, так как я могу столкнуться с некоторыми другими исключениями в будущем.

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

Нужен совет относительно того, как действовать дальше.

Примечание: Очередь транзакционная.

+2

Если ошибки требуют ручного вмешательства, не могли бы вы переместить их во вторую очередь ошибок? – Bill

+0

Мне нужно пойти с @Bill, вот как это делается. Перемещайте сообщения, которые разбиваются в очередь, чтобы они могли управляться. Мы обрабатываем сотни тысяч сообщений MQ в день, и это единственный управляемый подход. Это приводит к тому, что очередь PROD работает и обрабатывает то, что она может. Затем мы используем Patrol для оповещения о том, когда эти очереди получают сообщения. –

+0

@ bill Есть ли функция MSMQ, которая помещает эти сообщения в очередь резервного копирования или резервного копирования .... или это должно быть сделано в коде. – Macnique

ответ

1

Насколько я знаю, MSMQ автоматически не сбрасывает сообщения в очереди сбоев. В любом случае вы справляетесь с этим, это всего лишь несколько строк кода (Bill, Michael, и я рекомендую очередь сбоев). Что касается очереди сбоев, вы можете просто создать один из них: .\private$\queuename_fail.

Surviving poison messages in MSMQ - достойная статья по этой точной теме, в которой есть пример приложения и исходный код в конце.

private readonly MessageQueue _failQueue; 
private readonly MessageQueue _messageQueue; 
/* Other code here (cursor, peek action, run method, initialization etc) */ 

private void dumpToFailQueue(Message message) 
{ 
    var oldId = message.Id; 
    _failQueue.Send(message, MessageQueueTransactionType.Single); 

    // Remove the poisoned message 
    _messageQueue.ReceiveById(oldId); 
} 

private void moveToEnd(Message message) 
{ 
    var oldId = message.Id; 
    _messageQueue.Send(message, MessageQueueTransactionType.Single); 

    // Remove the poisoned message 
    _messageQueue.ReceiveById(oldId); 
} 
+0

Благодарим вас за образец, но что, если _failQueue сильно ударит, что вызовет еще одну проблему, или кто-то должен вручную очистить эти сообщения. Или это хорошая идея, чтобы сохранить его в файл вместо очереди. – Macnique

+0

Это зависит от того, что вы хотите. Вы можете вручную очистить его, у вас может быть другой контроль процесса, который что-то с ним делает (т. Е. Продолжает пытаться обработать его), или вы можете отправить его в файл. Вам нужно будет решить, что делать. – matth

+0

Я бы предпочел пойти с файлом, так как он прост в обслуживании, и я могу видеть фактическое содержимое сообщения в отличие от msmq, и я могу использовать ваш код для тестирования по крайней мере, как перейти в конец очереди. – Macnique

0

В случае ошибки, сообщение помещается в очередь яд, если он настроен в web.config для служб WCF. Кроме того, вы можете настроить очередь повтора, если вам нужно, чтобы сообщение было переработано после определенной задержки.

Обновление: позвольте мне объяснить это требование. Нам нужно было обработать несколько xml, отправляемых из других систем, и им пришлось вставлять/обновлять/удалять данные в хранилище данных. Иногда запрос на обновление помещается в очередь перед запросом на создание (из-за некоторых внешних зависимостей системы). Следовательно, когда запрос на обновление подбирается для обработки, он выдает ошибку (поскольку запись не существует в базе данных), которая затем помещается в очередь повторов, которая должна обрабатываться через 5 минут.В течение этого периода времени, если запрос на создание будет получен для обработки и будет успешным, через 5 минут, когда запрос на обновление будет выполнен, он будет успешным (потому что теперь он нашел соответствующую запись для обновления). В статье объясняются изменения конфигурации, которые требуются для очереди очередей & очереди ядов. Не требуется никакого изменения кода, кроме создания транзакционных очередей и включения транзакций в службе WCF. Poison and Retry message handling with MSMQ using WCF Net.Msmq binding

+0

Просьба представить пример кода, как и почему вы реализуете то, что вы предлагаете в статье, которую вы связали. –

+0

@BarryDoyle Я обновил детали. –

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