Cuando uso Spring para escuchar mensajes JMS, recibí el error anterior.Falló la ejecución del detector de mensajes JMS y no se configuró el Manejador de errores
Me pregunto cómo agregar un manipulador de errores en el agente de escucha JMS?
Cuando uso Spring para escuchar mensajes JMS, recibí el error anterior.Falló la ejecución del detector de mensajes JMS y no se configuró el Manejador de errores
Me pregunto cómo agregar un manipulador de errores en el agente de escucha JMS?
Hay una propiedad en 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>
Dónde someHandler
es un grano de implementar ErrorHandler
:
@Service
public class SomeHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.error("Error in listener", t);
}
}
Sin embargo tenga en cuenta que de acuerdo con el documentation:
El comportamiento por defecto de este mensaje oyente [...] será registre cualquier excepción en el nivel de error. [...] Sin embargo, si es necesario el manejo de errores, se puede proporcionar cualquier implementación de la estrategia ErrorHandler al método setErrorHandler (ErrorHandler).
Eche un vistazo a sus registros, tal vez la excepción ya está registrada?
Sin la configuración xml. Hice lo siguiente en 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);
}
}
En caso cuando se utiliza por defecto de fábrica:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
SomeHandler errorHandler) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(errorHandler);
return factory;
}
me gusta corto y dulce!
@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(t -> {
log.error("Error in listener!", t);
});
return factory;
}
gracias por su respuesta. Por cierto, ¿por qué usar @Service para este bean? – user705414
Parece que la excepción se registra usando el nivel WARN de manera predeterminada. – user705414
@ user705414: esto parece ser un error en la documentación: ['AbstractMessageListenerContainer.invokeErrorHandler()'] (http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-jms/ 3.0.6.RELEASE/org/springframework/jms/listener/AbstractMessageListenerContainer.java # AbstractMessageListenerContainer.invokeErrorHandler (java.lang.Throwable)) de hecho utiliza 'log.warn()'. Yo uso @Service para autodetectar el bean, por supuesto cualquier forma de declarar el bean controlador de errores está bien. –