2014-01-06 5 views
1

: 어떤 상황에서JMS, 특히 ActiveMQ를 사용할 때 JMSExceptions 처리? 다음 코드에서

Connection connection=getConnection(); 
try { 
    Session session=connection.createSession(); 
    try { 
     Queue queue=session.createQueue("foobar"); 
     MessageConsumer consumer=null; 
     try { 
      consumer = session.createConsumer(queue); 
     } 
     catch(JMSException e) { 
      // Under what circumstances does this happen? 
     } 
     try { 
      // ... 
     } 
     finally { 
      if(consumer != null) consumer.close(); 
     } 
    } 
    finally { 
     session.close(); 
    } 
} 
finally { 
    connection.close(); 
} 

가 발생 JMSException 잡은된다? 문제가 발생하면 JMSException을 처리하는 적절한 방법은 무엇입니까? JMS 및 ActiveMQ 관련 문서를 읽었으며이 점에 대한 지침을 제공하지 않습니다 (당연히 try/catch을 사용하는 것 이외에). 또한 인위적인 코드 예제를 용서하십시오! session 어떤 방법으로 "나쁜 사라"경우

는 예를 들어, JMSException 발생합니까, 그래서 똑바로 살아라는 consumersession를 해체하고 다시 시작하는거야? 아니면 connection이 잘못되었다는 뜻인가요? 그래서 그 연결을 기반으로하는 응용 프로그램의 모든 것을 찢어서 다시 만들어야합니까? 또는 createConsumer()에 대한 호출이 일시적으로 실패 할 수 있으며 동일한 세션으로 통화를 다시 시도 할 수 있습니까? 마찬가지로

,이 라인은 같은 것을 무시하는 JMSException 던질 것이다 때 Session 또는 Connection 폐쇄 :

Message message=consumer.receive(); 
producer.send(message); 
내가 JMSException의는 일반적으로 JMS에서 처리하는 방법을 이해하고 싶습니다

하지만 답변 특정 ActiveMQ는 괜찮습니다. 실제로 JMS는 스펙에 불과하기 때문에 모든 응답은 특정 구현에만 국한 될 수 있습니다.

답변

1

예외는 여러 가지 이유로 발생할 수 있습니다. 가장 일반적인 것은 다운 네트워크 또는 브로커로 인해 연결이 끊어진 것입니다. 브로커에서 리소스가 고갈되거나 보안 위반이 발생할 수있는 다른 이유가있을 수 있습니다.

네트워크 연결 문제로 인한 예외를 방지하려면 ActiveMQ의 장애 조치 전송을 사용하여 클라이언트가 자동으로 다시 연결되도록 할 수 있습니다. JMS에는 여러 가지 예외 유형이 있으므로 보안 예외로 인해 소비자 생성 또는 생산자 전송 실패 여부를 확인하는 것과 같이 주어진 오류를 테스트 할 수 있습니다. 실제 원인을 모르는 경우 가장 일반적인 일은 연결 리소스를 분리하여 다시 작성하는 것입니다. 따라서 페일 오버를 사용하면 클라이언트가이를 감지하고 응답하도록 처리하여 많은 작업을 피할 수 있으므로 더 좋습니다.

+0

멋진 답변. 내가 알 필요가있는 것. Tim 감사합니다! – sigpwned