Выполнение прослушивателя сообщений JMS не выполнено, и ErrorHandler не был установлен - PullRequest
22 голосов
/ 19 января 2012

Когда я использую Spring для прослушивания сообщений JMS, я получил вышеуказанную ошибку.

Мне интересно, как добавить обработчик ошибок в прослушиватель JMS?

Ответы [ 4 ]

18 голосов
/ 19 января 2012

Есть свойство на 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:

@Service
public class SomeHandler implements ErrorHandler {

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

Однако учтите, что согласно документации :

Поведение по умолчанию этого прослушивателя сообщений [...] регистрирует любое такое исключение на уровне ошибки . [...] Однако, если обработка ошибок необходима, тогда любая реализация стратегии ErrorHandler может быть предоставлена ​​методу setErrorHandler (ErrorHandler).

Проверьте ваши журналы, может быть, исключение уже зарегистрировано?

3 голосов
/ 08 апреля 2016

Без конфигурации 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);
    }
}
2 голосов
/ 30 ноября 2017

Мне нравится это коротко и сладко!

    @Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
    SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setErrorHandler(t -> {
         log.error("Error in listener!", t);
       });
    return factory;
}
0 голосов
/ 08 декабря 2016

Если используется заводская установка по умолчанию:

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
            SomeHandler errorHandler) {
        DefaultJmsListenerContainerFactory factory =
                new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setErrorHandler(errorHandler);
        return factory;
    }
...