Springを使用してJMSメッセージをリッスンすると、上記のエラーが発生しました。
ErrorhandlerをJMSリスナーに追加する方法を知りたいですか?
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>
ここで、someHandler
は ErrorHandler
を実装するBeanです。
@Service
public class SomeHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.error("Error in listener", t);
}
}
ただし、 documentation によると、
このメッセージリスナーのデフォルトの動作[...]は、そのような例外をエラーレベルでログに記録します。 [...]ただし、エラー処理が必要な場合は、ErrorHandler戦略の実装をsetErrorHandler(ErrorHandler)メソッドに提供できます。
ログを確認してください。おそらく例外はすでに記録されていますか?
短くて甘いのが好きです!
@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(t -> {
log.error("Error in listener!", t);
});
return factory;
}
Xml構成なし。 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);
}
}
デフォルトのファクトリーを使用した場合:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
SomeHandler errorHandler) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(errorHandler);
return factory;
}