2012-01-19 42 views

回答

16

有上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); 
    } 
} 

,根據documentation但是注意這個消息監聽器的代碼將會是在錯誤級別處記錄任何此類異常。 [...]但是,如果需要錯誤處理,則可以將任何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()'。我使用@Service來自動檢測這個bean,當然,任何聲明錯誤處理器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; 
} 
相關問題