2012-01-19 9 views

答えて

16

AbstractMessageListenerContainerのプロパティがあります:

someHandlerErrorHandlerを実装する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)メソッドに提供することができます。

ログを確認してください。例外が既に記録されている可能性がありますか?

+0

ご回答ありがとうございます。なぜ、このBeanに@Serviceを使用するのですか? – user705414

+0

デフォルトでWARNレベルを使用して例外が記録されているように見えます。 – user705414

+1

@ 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を宣言する方法は問題ありません。 –

2

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); 
    } 
} 
0

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

は、私はそれが短いと甘い好き!

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