2010-11-19 163 views
0

我看到一個問題,其中隊列沒有備份,但是消費者實際執行JMS消息的時間在創建後100到200秒之間(通過JMSTimestamp-CurrentTime測量)。ActiveMQ消費者執行延遲

流量相對較低,每分鐘少於30封郵件。我能夠通過重新啓動ActiveMQ來解決問題,之後消息從創建時開始少於1ms。

我正在使用ActiveMQ 5.4.1,正在MDB中完成的工作的正常執行時間少於2ms。在延遲的時候,ActiveMQ日誌中沒有錯誤消息,CPU很低並且內存充足。

看起來消費者似乎將消息從隊列中拉出,但由於某種原因而坐在他們身上。

是否有一些配置問題可能導致此問題?

編輯:

我MDB的第一行是:

/* Check the time since this message was created versus processed */ 
     try { 
      long secondsToProcess = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - aMessage.getJMSTimestamp()); 
      if (secondsToProcess > 5) { 
       log.error("JMS Consumer Start Delay: " + secondsToProcess + " s" + " JMS Message took more then 5 seconds to be processed"); 
      } else { 
       log.debug("JMS Consumer Start Delay: " + secondsToProcess + " s"); 
      } 
     } catch (Exception e) { 
      log.error(e); 
     } 
+0

您是否嘗試在MDB的頂部放置一條日誌語句以查看它實際上是否正在獲取它?這似乎是一些奇怪的交易錯誤。 – javamonkey79 2010-11-19 17:13:08

+0

是的,我是,看到更新的問題 – Jeremy 2010-11-19 19:08:25

回答

0

事實證明,ActiveMQ表現得很好,我的工作人員花了很長時間,因此備份隊列。我的問題中的代碼讓我看到了這一點。

0

如何某些你的消費是拉動該消息立即關閉隊列? ActiveMQ提供您可以用來確認的JMSActiveMQBrokerInTimeJMSActiveMQBrokerOutTime屬性(請參閱ActiveMQ message properties)。

+0

謝謝我會給出一個 – Jeremy 2010-11-20 15:49:46

+0

SimonJ,在代理中的總時間幾乎完全等於System.currentTimeMillis() - aMessage.getJMSTimestamp()。這向我暗示,這位經紀人進出市場的速度很慢。 – Jeremy 2010-12-02 15:47:50