2010-11-19 5 views
0

대기열이 백업되지 않지만 실제로 컨슈머가 JMS 메시지를 실행하는 시간은 (JMSTimestamp-CurrentTime을 통해 측정 한 바와 같이) 생성 후 100 - 200 초 사이 인 문제가 나타납니다.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

+0

예, 업데이트 된 질문이 표시됩니다. – Jeremy

답변

0

ActiveMQ는 정상적으로 작동했기 때문에 직원들이 대기 시간을 너무 오래 걸리는 것으로 나타났습니다. 내 질문에이 코드는 그것을 볼 수있었습니다.

0

어떻게 특정 당신이 소비자가 바로의 큐 메시지를 당기고 있는지? ActiveMQ는이를 확인하는 데 사용할 수있는 JMSActiveMQBrokerInTimeJMSActiveMQBrokerOutTime 속성을 제공합니다 (ActiveMQ message properties 참조).

+0

감사합니다. 그 결과를 알려 드리겠습니다. – Jeremy

+0

SimonJ, 브로커의 총 시간은 System.currentTimeMillis() - aMessage.getJMSTimestamp()와 거의 같습니다. 이것은 중개업자들이 그 (것)들을 전달하는 것이 느리다는 것을 나에게 암시한다. – Jeremy