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

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

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

为了避免丢失消息,现在我首先查看消息,如果格式良好,我使用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 ie if msg.Body does not have any problem Message wellFormattedMsg = _queue.ReceiveById(msg.Id); SendMessageToDatabase(message); } 

这种逻辑是否适合首先使用Peek然后接收? 或者还有其他更好的方法来实现同样的目标吗? 请注意,我不希望一次收到所有邮件。 MessageQueue是非事务性的。

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

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

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

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

干杯
约翰休斯威尔