복붙노트

[SPRING] JMS 메시지 수신기 실행에 실패했으며 ErrorHandler가 설정되지 않았습니다.

SPRING

JMS 메시지 수신기 실행에 실패했으며 ErrorHandler가 설정되지 않았습니다.

Spring을 사용하여 JMS 메시지를 수신 할 때 위의 오류가 발생했습니다.

JMS 수신기에 Errorhandler를 추가하는 방법이 궁금합니다.

해결법

  1. ==============================

    1.AbstractMessageListenerContainer에는 속성이 있습니다.

    AbstractMessageListenerContainer에는 속성이 있습니다.

    <bean id="listener" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="errorHandler" ref="someHandler"/>
        <property name="destinationName" value="someQueue"/>
        <property name="connectionFactory" ref="connectionFactory"/>
    </bean>
    

    someHandler가 ErrorHandler를 구현하는 bean 인 곳 :

    @Service
    public class SomeHandler implements ErrorHandler {
    
        @Override
        public void handleError(Throwable t) {
            log.error("Error in listener", t);
        }
    }
    

    그러나 문서에 따르면 :

    로그를 확인하십시오. 예외가 이미 기록되었을 수 있습니다.

  2. ==============================

    2.xml 구성없이. 나는 ApplicationContext에서 다음을 수행했다.

    xml 구성없이. 나는 ApplicationContext에서 다음을 수행했다.

    @Bean
    JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory,
            SomeHandler errorHandler) {
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setErrorHandler(errorHandler);
        return factory;
    }
    
    
    // From Tomasz answer
    @Service
    public class SomeHandler implements ErrorHandler {
    
        @Override
        public void handleError(Throwable t) {
            log.error("Error in listener", t);
        }
    }
    
  3. ==============================

    3.나는 짧고 달콤한 것을 좋아한다!

    나는 짧고 달콤한 것을 좋아한다!

        @Bean
    JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setErrorHandler(t -> {
             log.error("Error in listener!", t);
           });
        return factory;
    }
    
  4. ==============================

    4.기본 공장 사용시 :

    기본 공장 사용시 :

        @Bean
        public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
                SomeHandler errorHandler) {
            DefaultJmsListenerContainerFactory factory =
                    new DefaultJmsListenerContainerFactory();
            factory.setConnectionFactory(connectionFactory);
            factory.setErrorHandler(errorHandler);
            return factory;
        }
    
  5. from https://stackoverflow.com/questions/8922532/execution-of-jms-message-listener-failed-and-no-errorhandler-has-been-set by cc-by-sa and MIT license