2012-01-19 15 views

Respuesta

16

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?

+0

gracias por su respuesta. Por cierto, ¿por qué usar @Service para este bean? – user705414

+0

Parece que la excepción se registra usando el nivel WARN de manera predeterminada. – user705414

+1

@ 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. –

2

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); 
    } 
} 
0

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; 
    } 
1

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; 
} 
Cuestiones relacionadas