如何从消息队列中删除消息(只有格式良好)?

时间:2011-02-25 09:57:42

标签: c# .net-3.5 msmq

我想从一个队列中获取消息并将其发送到数据库。我只想在特定格式下才能这样做。

如果我直接使用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然后接收这个逻辑是正确的吗?或者还有其他更好的方法来实现同样的目标吗?请注意,我不希望一次收到所有消息。 MessageQueue是非事务性的。

2 个答案:

答案 0 :(得分:2)

这与我一次手动将消息一个出列时采用的方法相同,但我没有遇到任何问题。

您似乎没有处理的一件事是如何处理队列中没有所需格式的消息。你打算把它留在队列中吗?如果是这样,您最终可能会遇到一个非常大的队列,并且在查看队列中尚未预期的消息时会遇到各种各样的问题。如果无法删除那些没有所需格式的消息并将它们存储在其他位置似乎更有意义。

答案 1 :(得分:1)

“如果我直接使用Receive方法并且在访问消息体时发生了一些异常,我会丢失消息,因为MessageQueue的Receive方法会从队列中删除消息。”

您应该使用事务性接收,以便在事务中止时消息返回队列。

干杯
John Breakwell