2011-08-10 4 views
0

오늘 (메시지 브로커 및 JMS 공급자로 ActiveMQ를 사용하여) TopicSubscriber 개체를 실험하고있었습니다. 연결을 설정 한 후 동기 수신을 시작한 경우 연결을 설정하고 첫 번째 수신을 시작하는 사이에 ActiveMQ를 중지하면 예외가 발생한다는 것을 알았습니다. 그러나 연결을 수행 한 다음 성공적인 수신을 한 다음 브로커를 중지하고 두 번째 수신을 수행하면 수신 메시지에 예외가 발생하는 대신 지속적으로 null 메시지가 반환됩니다. 브로커는 몇 시간을 기다린 후에도 잃어 버렸습니다. 그리고 나서, ActiveMQ를 다시 시작한 후, 내 프로그램이 닫히지 않고 연결이 재개되지 않으면, 수신 된 프로그램이 작동하지 않습니다.java.jms.TopicSubscriber가 메시지 브로커와의 연결을 잃을 때 어떻게 알 수 있습니까?

나는이 문제를 코딩 할 수 있다는 것을 알고 있지만 연결이 끊어 졌는지 알 수있는 방법을 아는 것이 있는지 궁금해하고 있습니다. 방법이 있는지 또는이 코드가 내가 코딩해야하는 ActiveMQ의 JMS 구현의 "기능".

답변

1

몇 년 동안 ActiveMQ를 사용 해왔다. 대기열이 아니라 주제가 있지만, 그런 행동을 한 번도 본 적이 없다. 브로커가 소비자를 제대로 연결 해제하지 않고 연결이 끊어지면 소비자가 문제를 즉시인지하지 못할 수도 있습니다. 확실하지는 않지만 ActiveMQ 소비자는 연결이 이루어진 후 브로커와 이야기를 많이하지 않는다고 생각합니다. 그들은 메시지 배달을 기다립니다. 아직도, 나는 어떤 종류의 하트 비트가있을 것으로 기대하고 있으며, OpenWire Format page에는 OpenWire가 기본 30 초 유휴 시간을 가지고 있음을 암시한다. 소비자가 어떤 것을 보내려고하는지 네트워크 모니터링을 시도하십시오. 그래도 연결이 죽었다는 것을 인식하지 못한다면, 계속 생기는 뭔가가 있습니다. 그렇지 않으면 키프로브를 수행하는 올바른 방법을 찾는 것이 중요 할 것입니다. TCPTransport keepalive etting도 조사하는 것이 좋습니다.

+0

감사합니다. Ryan. 문제의 일부는 ActiveMQ를 종료하는 방법입니다. 방금 CTRL-C를 눌렀고 종료하려면 예라고 말했습니다. 일들이 "더 잘된다면"내가 정상적으로 종료되는지 알 수있을 것입니다. 참고로, 나는 또한 주기적으로 비동기 적으로 전달되기를 기다리는 대신 주기적으로 사용 가능한 메시지를 동 기적으로 잡는 방법으로 이상하게 보입니다. Javadoc은 아무것도없는 경우 다시 null 메시지를 받았다고 말합니다. 브로커가 다운 된 경우 예외가 throw되어야하는지 여부는 다소 모호합니다. – Dale

+0

참고 지금부터는 연결하고 메시지를 잡고 연결을 끊을 수 있습니다. 나는 폴링을 통해 연결을 유지하려고 노력했지만, 내가 목격 한 행동이 일어난다면 그렇지 않다. 아직 연결이 유효한지 확인할 수있는 간단한 방법이 있었으면 좋겠지 만 본 적이 없습니다. – Dale

+0

@Dale : "synchronously grabbing"이 consumer.receive() 또는 이와 비슷한 것을 의미하는 경우, 해당 메서드를 호출 할 때 서버를 호출 할 때 서버에 "손을 뻗지"않는다는 것을 알아야합니다. 효율성을 위해 ActiveMQ는 일괄 적으로 소비자에게 메시지를 전달합니다 (기본 일괄 처리 크기는 1000입니다), 소비자는이를 내부 대기열에 보관합니다. consumer.receive()를 호출하면이 내부 대기열에서 사용 가능한 메시지 만 가져옵니다. 서버에 충돌하지 않습니다. JMS 항목을 관리하는 가장 간단한 방법은 [Spring JMS] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jms.html)를 사용하는 것입니다. –

관련 문제