2014-07-02 63 views
1

我的應用程序(基於.NET)以多線程方式從隊列中獲取消息,我很擔心我可能以亂序方式接收消息,因爲線程可以比其他更快,例如,給出以下隊列狀態:通過排隊順序發送消息序號

[Message-5 |消息-4 |消息-3 | Message-2 |消息-1]

在多線程操作,MSG#2可能之前MSG#1到達,即使MSG#1最早是在隊列中,由於許多線程的問題(線程時間切片,線程調度等)。

在這樣的情況下,如果隊列中的消息在排隊時已經用序號/序列號標記了,並且即使按照亂序獲得消息,我也可以仍然使用他們給定的序號屬性在我的應用程序中的某個點上對它們進行排序。

任何已知的機制都可以在Websphere MQ環境中實現它?

回答

2

你有兩個選擇:

(1)使用消息分組在MQ作爲whitfiea提及或

(2)改變你的應用程序是單線程。注意:如果發送應用程序未設置MQMD MsgId字段,則隊列管理器將生成一個唯一編號(基於隊列管理器名稱,日期&時間),並將其存儲在消息的MQMD MsgID字段中。

+0

感謝您的回答,如果我將使用消息的'timestamp'屬性,該怎麼辦? –

0

是,如果初始的消息有一個序,然後當你收到你的數據,你可以:

使用一個線程安全的詞典:

SortedDictionary<int,Message> 
+0

問題是我首先需要一個數字加蓋郵件。 –

+0

怎麼會知道命令?如果發送的數據沒有任何東西來識別順序,那麼你也不會,如果是這種情況,那麼你會希望同一線程接收整組消息以保證數據是連續的。 –

2

您可以獲取MessageSequenceNumber從MQMessage如果消息被放入消息組的隊列中。 MessageSquenceNumber既可以是消息放置到隊列中的順序,也可以是將消息放入隊列的應用程序定義的順序。

MessageSequenceNumberhere更多細節

+0

感謝您的有趣答案,您可以詳細解釋一下這個功能嗎? –

+1

這個功能可以在SO評論中用大來形容,所以我推薦閱讀:(http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/ q026270_.htm)和這個:(http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q023060_.htm)。 – whitfiea