Я хочу взять сообщение из одной очереди и отправить его в базу данных.Я хочу сделать это только в том случае, если он находится в определенном формате.
Если я использую метод 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 не является транзакционным.