JMSメッセージを受信するためにSpringを使用すると、私は上記のエラーを受け取ります。JMSメッセージリスナーの実行に失敗し、ErrorHandlerが設定されていません
エラーハンドラをJMSリスナーに追加する方法を知りたいですか?
JMSメッセージを受信するためにSpringを使用すると、私は上記のエラーを受け取ります。JMSメッセージリスナーの実行に失敗し、ErrorHandlerが設定されていません
エラーハンドラをJMSリスナーに追加する方法を知りたいですか?
AbstractMessageListenerContainer
のプロパティがあります:
someHandler
は
ErrorHandler
を実装するBeanです
<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>
:
@Service
public class SomeHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.error("Error in listener", t);
}
}
しかしdocumentationに応じて次の点に注意してください
デフォルトの動作をこのメッセージリスナーの[...] will は、そのような例外をエラーレベルに記録します。 [...]ただし、エラー処理が必要な場合は、ErrorHandlerストラテジの実装をsetErrorHandler(ErrorHandler)メソッドに提供することができます。
ログを確認してください。例外が既に記録されている可能性がありますか?
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;
}
は、私はそれが短いと甘い好き!
@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(t -> {
log.error("Error in listener!", t);
});
return factory;
}
ご回答ありがとうございます。なぜ、このBeanに@Serviceを使用するのですか? – user705414
デフォルトでWARNレベルを使用して例外が記録されているように見えます。 – user705414
@ user705414:これはドキュメントの間違いです:['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))実際には 'log.warn()'を使用します。私はBeanを自動検出するために@Serviceを使用しています。もちろん、エラーハンドラBeanを宣言する方法は問題ありません。 –