2013-08-23 56 views
1

我有一個運行某個應用程序的4節點websphere應用程序服務器羣集。應用程序偵聽websphere mq服務器的隊列。我在集羣範圍內創建了jms資源,因此所有節點都連接到同一個隊列管理器,並且在mq explorer中,隊列的打開輸入計數爲4。問題是,如果消息發佈到隊列中,其中一個節點抓取消息並開始處理,但會引發錯誤,指出消息標頭不正確。當我關閉3個節點並且只保留一個節點時,該節點上的應用程序將讀取該消息並開始處理。我認爲讀取爭用在mq中不是問題,但事實指向另一個方向。有沒有一些方法來設置隊列中的某些屬性,如讀取鎖定或類似調度程序,它將消息公平地分發給4個節點?如何解決Websphere MQ服務器隊列讀取競爭條件?

回答

0

如果您使用GET而不是BROWSE讀取同步點下的消息,除非和直到發出ROLLBACK,否則沒有其他線程可以檢索它。如果該消息可以處理,則完成後發出COMMIT

另一方面,如果你的消息是BROWSE那麼所有線程都可以檢索到相同的消息。

無論發生什麼事情都不能歸因於相同消息的線程爭用以某種方式破壞消息。無論瀏覽消息還是破壞性地檢索消息,WMQ都可以確保呼叫的完整性和原子操作。爲了診斷這一點,有必要獲得更多有關您所看到的確切錯誤的信息,包括將包含傳輸提供程序本機返回碼的鏈接例外的打印。

+0

好,所以我一直是一個白癡,應用程序需要一個輸入xsd,我只在一個節點的文件系統。所以這不是一個真正的問題。我可以通過實現類似調度程序的方式來改進設置嗎?它以循環方式將消息服務於所有4個節點? – user1600936

+0

WMQ將分發消息循環,只要它們的進入速度快於任何一個節點都可以處理它們。但是,爲了提高GET請求的效率,它會被壓入堆棧,所以當緩慢到達時可能只有一個或兩個線程處理它們。您可以使用協作瀏覽功能編寫消息調度程序來循環執行,但說實話,這似乎不值得付出努力。要測試消息分發,請加載一個隊列,然後將所有消息一次複製到輸入隊列。然後你會看到循環賽的行爲。 –