我正在为使用DefaultJmsListenerContainerFactory
注册@JmsListener
注释方法的应用程序进行遥测和监视。
我已经注册了一个错误处理程序,用于接收消息时引发的异常,但是我想注册一个类似的错误处理程序,以监视我的应用程序与预订的主题之间的连接完整性。
我在setExceptionListener
中发现了这个漂亮的AbstractMessageListenerContainter
方法,但是DefaultJmsListenerContainerFactory
没有提供用于设置此属性的配置方法。
我在Spring框架JMS javadocs中进行了搜索,以查看是否有关于为什么的任何解释。有人知道为什么不公开吗?
答案 0 :(得分:1)
看起来像一个遗漏,或者被认为不是必须暴露的东西。我建议您打开一个Improvement JIRA issue。
同时,您可以从JmsListenerEndpointRegistry
(使用ID)获取对容器的引用,对其进行强制转换并设置属性。
编辑
类似的事情应该起作用...
@Bean
public SmartInitializingSingleton lcPostProcessor(JmsListenerEndpointRegistry registry) {
return () -> registry.getListenerContainers().forEach(c ->
((DefaultMessageListenerContainer) c).setExceptionListener(myExceptionListener()));
}
它在所有bean创建之后但任何容器启动之前运行。
答案 1 :(得分:0)
以下是最终使我可以访问此属性的内容。我测试过我仍然可以像以前一样从该主题接收消息
public class PortalJmsListenerContainerFactory
extends DefaultJmsListenerContainerFactory {
private ExceptionListener exceptionListener;
/**
* @see DefaultMessageListenerContainer#setExceptionListener
*/
public void setExceptionListener(ExceptionListener exceptionListener) {
this.exceptionListener = exceptionListener;
}
@Override
protected DefaultMessageListenerContainer createContainerInstance() {
return new DefaultMessageListenerContainer();
}
@Override
protected void initializeContainer(DefaultMessageListenerContainer container) {
super.initializeContainer(container);
if (this.exceptionListener != null) {
container.setExceptionListener(this.exceptionListener);
}
}
}