Как удалить сообщение из очереди сообщений (только если оно правильно отформатировано)? - PullRequest
1 голос
/ 25 февраля 2011

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

Если я использую метод Receive напрямую и возникает некоторая исключительная ситуация при доступе к Body Сообщения, я теряю сообщение, поскольку Receive методMessageQueue удаляет сообщение из очереди.

Чтобы избежать потери сообщения, теперь я сначала Peek сообщение и, если оно хорошо отформатировано, я использую метод Receive, чтобы удалить его из очереди вотправить его в базу данных.

Код, который я написал, выглядит следующим образом:

 Message msg = _queue.Peek(new TimeSpan(0, 0, LoggingService.Configuration.ReceiveTimeout));

// LogMessage is my own class which is adding some more stuff to original message from MessageQueue                
LogMessage message = null;

                if (msg != null)
                {
                    if (!(msg.Formatter is BinaryMessageFormatter))
                        msg.Formatter = new BinaryMessageFormatter();

                    message = LogMessage.GetLogMessageFromFormattedString((string) msg.Body);

                    // Use Receive method to remove the message from queue. This line will we executed only if the above line does not
                    // throw any exception i.e. if msg.Body does not have any problem
                    Message wellFormattedMsg =
                         _queue.ReceiveById(msg.Id);

                      SendMessageToDatabase(message);
                }

Правильно ли использовать эту логику, чтобы сначала использовать Peek, а затем Receive?Или есть какой-то другой лучший способ добиться того же? Обратите внимание, что я не хочу получать все сообщения одновременно.MessageQueue не является транзакционным.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

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

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

1 голос
/ 25 февраля 2011

"Если я использую метод Receive напрямую и при доступе к Body of Message возникает какое-то исключение, я теряю сообщение, поскольку метод Receive из MessageQueue удаляет сообщение из очереди."

Вы должны использовать транзакциюполучает так, что сообщение возвращается в очередь, когда / если транзакция прерывается.

Cheers
John Breakwell

...