我想从一个队列中获取消息并将其发送到数据库。我只想在特定格式下才这样做。
如果我使用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 是非事务性的。
这与我每次手动将一条消息出队时所采用的方法相同,并且我没有遇到任何问题。
您似乎没有处理的一件事是如何处理队列上不具有所需格式的消息。您打算将其留在队列中吗?如果是这样,您最终可能会得到一个非常大的队列,并且在查看队列中尚未预期的消息时会遇到各种问题。如果无法删除这些消息,则将那些不具有所需格式的消息也出队并将它们存储在其他地方似乎更有意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)