2014-07-23 5 views
1

mq 깊이를 얻고 싶습니다. getCurrentDepth을 사용하면 저장된/캐시 된 mq 대기열 객체에서 작동하지 않습니다.
'신선한'대기열 개체가 필요하고 accessQueue 메서드 호출을 수행하고 대기열을 가져 와서 해당 개체에 getCurrentDepth 메서드를 사용해야합니다. 그렇지 않으면 깊이는 항상 0입니다.IBM MQ getCurrentDepth는 accessQueue가 필요합니다.

나는이 문제와 관련하여 열려있는 질문/문서를 찾지 못했습니다.

리눅스에서 Java 버전 7.0 용 MQ 클라이언트를 사용하고 있습니다. 열린 옵션은 다음과 같습니다 : MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_INQUIRE | MQC.MQOO_FAIL_IF_QUIESCING 그리고 SSL 연결을 사용합니다.

감사합니다.

답변

1

저장된/캐시 된 mq 대기열 개체에서 작동하지 않는 것을 확인했습니다.

저장된/캐시 된 MQ 대기열 객체는 없습니다. 대기열 유형은 local, remote, alias cluster입니다.

은 내가 '신선한'큐 개체

신선한 (새로 고침)의 그러한 개념이 없습니다 큐 개체가 필요합니다.

getCurrentDepth 메소드는 MQQueue 클래스에 속합니다. 따라서 MQQueueManager 클래스의 accessQueue 메소드를 사용하여 큐에 액세스해야한다.

마지막으로 MQ 응용 프로그램에서 getCurrentDepth 메소드를 사용해야 할 필요는 없습니다. MQException이 MQRC_NO_MSG_AVAILABLE (2033) 이유 코드와 함께 던져 질 때까지 단일 메시지 나 루프를 얻습니다.

+0

mQueue = queueManager.accessQueue (aQueueName, aOptions, null, null, null); <\br> int depth = mQueue.getCurrentDepth(); <- 올바른 결과 <\br> depth = mQueue.getCurrentDepth(); <- zero - 아무도 큐에서 메시지를 선택하지 않은 경우에도 마찬가지입니다. 이 방법은 처음에만 제대로 실행되는 것 같습니다. 다시 한 번 accessQueue를 수행하면 메소드가 다시 한 번 작동합니다. – user293939

+0

이것은 몇 년 전에는 너무 늦었지만 왜 getCurrentDepth를 사용해야하는 이유가 없어야하는지 설명 할 수 있습니까? 내가 SpringBoot Jms Application을 MQ Queue에서 연결하고 읽었지만, MQRC_NO_MSG_AVAILABLE (2033)을 얻지는 않을 것이다. Spring의 어딘가에 잡히면 내 Listener가 멈추어 더 많은 메시지를 기다린다. 내 솔루션은 getCurrentDepth를 너무 자주 호출하고 0 일 때 마침내 종료 할 수있었습니다. 절대로 문제가 없었지만 그 이유가 무엇인지 들어보고 싶습니다. –

+0

첫 번째로, 잘못된 구성 요소 수신기를 사용한 것처럼 들리지만 필요없는 부분은 영원히 반복됩니다. 둘째, 트랜잭션의 일부이지만 커밋되지 않은 메시지는 '현재의 심도'카운트에 포함됩니다. – Roger

0

당신이 말하는 것은 accessQueue를 호출 한 다음 리턴 된 MQQueue 오브젝트에서 getCurrentDepth를 호출하고 예상 값을 리턴한다는 것입니다. 그런 다음 나중에 어떤 시점에서 동일한 MQQueue 오브젝트에 대해 getCurrentDepth()를 호출하면 0 (예상치 못한)이 리턴됩니다.

이전에이 동작을 보지 못했으며 예상 한 바가 아닙니다. MQQueue 객체가 'stale'이라면 getCurrentDepth 메소드에서 Throw 된 MQException을 얻고, 그것이 일어나지 않는다고 가정한다.

예를 들어, 다른 응용 프로그램이 메시지를 제거했거나 트랜잭션이 롤백 된 것으로 예상했는지 확인 했습니까?