Spring を使用して JMS メッセージをリッスンすると、上記のエラーが発生します。
エラーハンドラーを JMS リスナーに追加する方法を知りたいですか?
Spring を使用して JMS メッセージをリッスンすると、上記のエラーが発生します。
エラーハンドラーを 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
実装する Bean はどこにありますかErrorHandler
:
@Service
public class SomeHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.error("Error in listener", t);
}
}
ただし、ドキュメントによると、次のことに注意してください。
このメッセージ リスナーのデフォルトの動作 [...] は、そのような例外をエラー レベルでログに記録します。[...] ただし、エラー処理が必要な場合は、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;
}