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.
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?
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;
}
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);
}
}
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;
}