2012-01-19 15 views

Odpowiedz

16

Jest nieruchomość na 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> 

Gdzie someHandler jest fasola realizacji ErrorHandler:

@Service 
public class SomeHandler implements ErrorHandler { 

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

jednak pamiętać, że zgodnie z documentation:

domyślne zachowanie tego słuchacza wiadomości [...] będzie rejestruje każdy taki wyjątek na poziomie błędu. [...] Jednakże, jeśli obsługa błędów jest konieczna, wówczas każda implementacja strategii ErrorHandler może być dostarczona do metody setErrorHandler (ErrorHandler).

Sprawdź swoje logi, może wyjątek jest już zalogowany?

+0

dzięki za odpowiedź. BTW, dlaczego warto skorzystać z @Service dla tego komponentu bean? – user705414

+0

Wygląda na to, że wyjątek jest rejestrowany domyślnie na poziomie WARN. – user705414

+1

@ user705414: to wydaje się być błędem w dokumentacji: ['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)) rzeczywiście używa 'log.warn()'. Używam @Service do automatycznego wykrycia fasoli, oczywiście jakikolwiek sposób deklarowania fasoli obsługi błędów jest w porządku. –

2

Bez konfiguracji xml. Zrobiłem następujące w 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

W przypadku gdy stosowane fabryczne:

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

Lubię to krótkie i słodkie!

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