2011-02-25 58 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

相關問題