2017-09-27 2 views
0

Spring과 함께 Apache Camel을 사용하여 Java 서비스에서 메시지를 보내고 있습니다. 내가 교환에서 어떤 오류가 발생하면 특정 이벤트를 처리/트리거해야합니다. 내 목적을 달성하기 위해 아래 코드를 사용하고 있습니다. I을 테스트하기 위해JMS 연결이 던지지 않음 JMSSecurityException이 무단 라우트로 메시지를 보낼 때

try 
    { 
     producerTemplate.sendBody(endPoint, bytes); 
    } 
    catch (final RuntimeCamelException exception) 
    { 
     LOGGER.error("Exception occured in sendBody", exception.getMessage(), exception); 
     handleError(); // handle error here. 
    } 

잘못된 경로 이름 broadcast.SIMULATOR.ROUTE1에 엔드 포인트의 값을 설정합니다. 위의 코드를 실행하면 콘솔에서 다음과 같은 오류가 표시 될 수 있지만 catch 블록에는 절대로 들어오지 않습니다.

[33m16:15:51,714 WARN [org.springframework.jms.connection.CachingConnectionFactory] (QpidJMS Connection Executor: ID:7dacac8c-93ce-48c0-92fe-8dc0e8:1) Encountered a JMSException - resetting the underlying JMS Connection: javax.jms.JMSSecurityException: [email protected] cannot publish to broadcast with routing-key broadcast.SIMULATOR.ROUTE1 (/builddir/build/BUILD/qpid-cpp-1.36.0/src/qpid/broker/amqp/Authorise.cpp:126) [condition = amqp:unauthorized-access] 
at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToException(AmqpSupport.java:143) [qpid-jms-client-0.23.0.jar:] 
at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToException(AmqpSupport.java:117) [qpid-jms-client-0.23.0.jar:] 

경로에 여러 개의 메시지를 보내고 있습니다. 첫 번째 메시지의 경우 JMSSecurityException이 콘솔에 기록되고 실행이 계속됩니다. 두 번째 메시지 이후부터 IllegalStateException (세션 닫힘)으로 catch 내부로 실행됩니다.

첫 번째 메시지 (JMSSecurityException의 경우)를 사용하여 catch 블록 내에서 실행을 가져 오는 방법은 무엇입니까?

답변

1

사용중인 JMS 클라이언트에 따라 다릅니다. 그들 중 일부는 비동기식으로 메시지를 보냅니다. 이 옵션을 해제하는 데 사용할 수있는 구성 옵션이있을 수 있습니다.

예를 들어 Apache ActiveMQ에 asyncSend 옵션 http://activemq.apache.org/async-sends.html을 사용하면이 기능을 해제 할 수 있습니다.

+0

감사합니다. JmsConnectionFactory 및 해당 작업에 대해 유사한 속성 forceSyncSend = true가 발견되었습니다. –

관련 문제