2012-01-19 7 views

risposta

16

C'è una proprietà in 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> 

Dove someHandler è un fagiolo attuazione ErrorHandler:

@Service 
public class SomeHandler implements ErrorHandler { 

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

Tuttavia notare che secondo la documentation:

Il comportamento predefinito di questo listener di messaggi [...] sarà registra tali eccezioni al livello di errore. [...] Tuttavia, se è necessaria la gestione degli errori, qualsiasi implementazione della strategia ErrorHandler può essere fornita al metodo setErrorHandler (ErrorHandler).

Controllare i log, forse l'eccezione è già registrata?

+0

grazie per la risposta. A proposito, perché usare @Service per questo bean? – user705414

+0

Sembra che l'eccezione venga registrata utilizzando il livello WARN per impostazione predefinita. – user705414

+1

@ user705414: questo sembra essere un errore nella documentazione: ['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)) utilizza infatti 'log.warn()'. Io uso @Service per rilevare automaticamente il bean, ovviamente ogni modo per dichiarare che il bean del gestore degli errori è corretto. –

2

Senza la configurazione xml. Ho fatto quanto segue in 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

Nel caso in cui utilizzata di fabbrica:

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

mi piace breve e dolce!

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