2011-02-25 30 views
1

我想从一个队列中获取消息并将其发送到数据库。我只想在特定格式的情况下这样做。如何从消息队列中删除消息(仅在格式良好的情况下)?

如果我使用直接Receive方法和在访问消息的Body发生一些异常,我失去消息由于MessageQueueReceive方法从队列中移除该消息。

为了避免丢失信息,现在我第一次使用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); 
       } 

这是逻辑有权首先使用窥视,然后接收?或者有没有其他更好的方法来实现同样的目标?请注意,我不想一次收到所有消息。 MessageQueue是非事务性的。

+0

相关[我怎样才能把一个队列中的消息?(http://stackoverflow.com/q/23227194/706456) – oleksii 2014-05-23 11:27:49

回答

2

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

你似乎没有处理的一件事是如何处理队列中没有所需格式的消息。你打算把它放在队列中吗?如果是这样的话,你可能会得到一个非常大的队列,并且会遇到各种各样的问题,这些问题是在队列中进一步窥探尚未预期的消息。对于那些不具备所需格式的消息,如果它们不能被删除,那么看起来更有意义。

+0

我upvoted你现在。你是对的。在我的逻辑中,我将这些不好格式的消息移动到其他一些队列中,这些队列仅用于保存这些有问题的消息。用我的方法,我很担心,如果信息数量很大,并且我们在每次接收之前都会查看它,是否会花费相当大的性能问题。 – Learner 2011-02-25 11:20:29

+0

如果您总是要处理邮件或将邮件移动到另一个队列,那么可能不需要偷看,因为您将始终将邮件内容取消,而不会考虑邮件的内容。 – Jason 2011-02-25 11:27:47

+0

你说得对。 Peek根本没有必要。我可以通过处理异常来实现同样的目的。如果我添加这行消息= LogMessage.GetLogMessageFromFormattedString((字符串)msg.Body);'在尝试块和异常块,如果我发送消息,因为它,到另一个队列,我达到了我想要的。感谢您的投入。我将其标记为答案。 – Learner 2011-03-03 10:19:46

1

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

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

干杯
约翰Breakwell

+0

因为问题中提到的消息队列是非事务性的,所以不可能使用事务。 – Learner 2011-02-28 04:25:23

+1

对不起 - 最后错过了那一点。建议仍然存在。是否有原因不首先使用事务队列?你说你想避免消息丢失,但是使用非事务性队列。 – 2011-02-28 09:39:52

相关问题