2016-11-01 61 views
0

我有一個系統,讀出從IBM MQ消息。從這個隊列中,我們有時會得到損壞的數據。如果下一次讀取消息失敗,監聽器將等待5分鐘,然後再繼續。當一條消息失敗3次後,它將被放在退避隊列中。 JMSContainerFacotry設置爲並行運行最大值10。這意味着如果我們收到大量損壞的消息,這些消息每次需要10分鐘以上才能到達退避隊列(這是正常的),但它們最終消耗了所有線程,因此其他消息必須等待所有損壞到達在處理之前退避隊列。我想從監聽器中刪除wait(),這樣就不會阻塞線程,但失敗的消息在彈出備份之前仍然會等待5分鐘。消息重新傳遞IBM MQ

我知道,和ActiveMQ你可以告訴隊列再次彈出相同的消息,與IBM MQ我沒有這種可能性之前要等待5分鐘。是否有可能將失敗的消息放在隊列後面?現在失敗的消息似乎在新的消息面前流行起來。或者將失敗消息上的jmspriority設置得更低。因此,如果有消息還沒有失敗,會在隊列失敗之前從隊列中彈出?

我的聽衆是大約如此:

@JMSListener() 
public void listen(Object message) { 
TextMessage textMessage = (TextMessage) message; 

if (textMessage.getIntProperty("JMSXDeliveryCount") > 1) { 
//pause for 5 minutes 
} 

//buisness logic 

} 

的在隊列是IBM MQ。 AS是Jboss的6

回答

0

不知道你爲什麼暫停5分鐘,如果你得到一個帶毒郵件。如果你知道這很糟糕,你爲什麼不把它扔掉或者將它傳遞給退出隊列以供進一步調查?請參閱JMS帶毒郵件處理:

http://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q032280_.htm

更令人擔心的,你爲什麼讓這麼多的「壞」的消息?

+0

因爲我們'重新講了很多其他的應用,如果他們中的一個重新部署,我們會得到一個錯誤,並希望稍後再試。 我們沒有收到很多壞消息,但是有幾次我們收到了大量重複的消息。然後全部失敗,因爲ID已經存在於數據庫中。 – user1764597

+0

但是,爲什麼不簡單地處理這個'壞'的消息,並繼續消費下一個? –

0

我知道,和ActiveMQ你可以告訴隊列再次彈出相同的消息,與IBM MQ之前等待5分鐘 我不有 可能性。

嘗試之間的重試時間間隔選項需要在MDB偵聽器端進行設置,因爲它充當客戶端。但不在WMQ方面。

是否可以將失敗的消息放回隊列中?

您想將消息放回隊列或將有毒消息放在同一隊列的末尾? 我們無法動彈毒郵件到同一隊列的末尾

只有三個選項,以處理有毒的消息:

  1. 將消息放回隊列
  2. 重將消息路由要麼BOQ或DLQ
  3. 吹掃或永久丟棄它。