web-dev-qa-db-de.com

Die Ausführung des JMS-Nachrichtenlisteners ist fehlgeschlagen, und es wurde kein ErrorHandler festgelegt

Wenn ich Spring zum Abhören von JMS-Nachrichten verwende, wurde der obige Fehler angezeigt. 

Ich frage mich, wie man einen Errorhandler in den JMS-Listener einfügt.

21
user705414

Es gibt eine Eigenschaft unter 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>

Wobei someHandler eine Bean ist, die ErrorHandler implementiert:

@Service
public class SomeHandler implements ErrorHandler {

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

Beachten Sie jedoch, dass gemäß der Dokumentation :

Das Standardverhalten dieses Nachrichtenlisteners [...] wird eine solche Ausnahme auf der Fehlerebene protokollieren. [...] Wenn jedoch eine Fehlerbehandlung erforderlich ist, kann die Implementierung der ErrorHandler-Strategie für die setErrorHandler-Methode (ErrorHandler) bereitgestellt werden.

Überprüfen Sie Ihre Protokolle, vielleicht ist die Ausnahme bereits protokolliert?

18

Ich mag es kurz und süß!

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

Ohne die XML-Konfiguration. Ich habe folgendes im ApplicationContext gemacht.

@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
Kuchi

Wenn das Standardwerk verwendet wird:

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