JBossMQ의 대기열에서 텍스트 메시지를 읽는 Java 수신기가 있습니다. JBoss를 재부팅해야한다면 리스너는 다시 연결되지 않고 메시지 읽기를 다시 시작합니다. 청취자의 로그 파일에 2 분마다 연결할 수 없다는 메시지가 표시됩니다. 우리 코드 나 JBossMQ에서 설정하지 않은 것이 있습니까? JMS에 익숙하지 않아 어떤 도움을 주시면 대단히 감사하겠습니다. 감사.JMS 리스너를 JBossMQ에 다시 연결
답변
클라이언트 코드 javax.jms.ExceptionListener에 구현해야합니다. onException이라는 메서드가 필요합니다. 클라이언트 연결이 끊어지면 JMSException을 가져와야하며이 메서드는 자동으로 호출됩니다. JBossMQ와의 연결을 의도적으로 끊는 경우에만 예외를 throw합니다.
일부 코드는 다음과 같습니다 당신의 "establishConnection"코드에서
public void onException (JMSException jsme)
{
if (!closeRequested)
{
this.disconnect();
this.establishConnection(connectionProps, queueName, uname, pword, clientID, messageSelector);
}
else
{
//Client requested close so do not try to reconnect
}
}
, 당신은 다음의 내부 시도/캐치를 포함하는 while(!initialized)
구조를 구현합니다. 제대로 연결하고 구독했는지 확인하기 전까지는 모든 JMS/Naming/etc를 포착하는 while 루프 안에 있어야합니다. 예외.
우리는 JBossMQ로 수년간이 방법을 사용해 왔으며 효과가 좋습니다. JBossMQ를 수신 거부하거나 네트워크 연결을 끊은 후에도 JMS 클라이언트가 다시 연결되지 않는 문제는 없었습니다.
ExceptionListener를 등록하려면 Connection # setExceptionListener (일부 JMS 공급자 이상)를 사용해야합니다. – Touko
재 연결, 거래 및 풀링을 처리하려면 Spring abstractions for JMS such as the MessageListenerContainer을 사용하시기 바랍니다. MessageListener를 제공하고 ConnectionFactory로 MessageListenerContainer를 구성하면 컨테이너가 나머지 작업을 수행하면됩니다.
순전히 청취자이고 이 아니고 다른 JMS 호출이 연결 설정이 아닌 경우 "onException() handler"응답이 올바른 것입니다.
코드에서 JMS 호출을 수행하는 경우 onException() 콜백만으로는 충분하지 않습니다. JMS 제공자로부터 중 하나의 문제는 onException() 콜백을 통해 또는 JMS 메소드 호출의 예외를 통해 문제가 중계됩니다. 둘 다 아닙니다.
코드에서 JMS 메소드를 호출하는 경우 해당 호출에 대한 예외가 발생하는 경우 해당 재 연결 논리를 호출 할 수도 있습니다.
개인적인 경험을 통한 조언. JBoss Messaging으로 업그레이드하십시오. 4 개월 동안 생산 과정에서 문제없이 보았습니다. 이 제품은 다른 많은 기능 중에서도 투명한 페일 오버 기능을 제공합니다.
또한 스프링을 사용하려면 JmsTemplate 인 verycareful이되어야합니다.
좋은 질문입니다. 이것은 모두가 겪는 일이므로 토론을 기록하는 것이 좋습니다. –