web-dev-qa-db-ja.com

JMSメッセージリスナーの実行に失敗し、ErrorHandlerが設定されていません

Springを使用してJMSメッセージをリッスンすると、上記のエラーが発生しました。

ErrorhandlerをJMSリスナーに追加する方法を知りたいですか?

23
user705414

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>

ここで、someHandlerErrorHandler を実装するBeanです。

@Service
public class SomeHandler implements ErrorHandler {

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

ただし、 documentation によると、

このメッセージリスナーのデフォルトの動作[...]は、そのような例外をエラーレベルでログに記録します。 [...]ただし、エラー処理が必要な場合は、ErrorHandler戦略の実装をsetErrorHandler(ErrorHandler)メソッドに提供できます。

ログを確認してください。おそらく例外はすでに記録されていますか?

19

短くて甘いのが好きです!

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

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);
    }
}
3
Kuchi

デフォルトのファクトリーを使用した場合:

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