Gdy używam Spring do słuchania wiadomości JMS, otrzymuję powyższy błąd.Wykonanie detektora komunikatu JMS nie powiodło się i nie ustawiono obiektu ErrorHandler
Zastanawiasz się, jak dodać moduł obsługi błędów do modułu nasłuchiwania JMS?
Gdy używam Spring do słuchania wiadomości JMS, otrzymuję powyższy błąd.Wykonanie detektora komunikatu JMS nie powiodło się i nie ustawiono obiektu ErrorHandler
Zastanawiasz się, jak dodać moduł obsługi błędów do modułu nasłuchiwania JMS?
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?
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);
}
}
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;
}
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;
}
dzięki za odpowiedź. BTW, dlaczego warto skorzystać z @Service dla tego komponentu bean? – user705414
Wygląda na to, że wyjątek jest rejestrowany domyślnie na poziomie WARN. – user705414
@ 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. –