为什么DefaultJmsListenerContainerFactory不公开setExceptionListener方法?

时间:2018-12-05 19:09:24

标签: spring jms spring-jms

我正在为使用DefaultJmsListenerContainerFactory注册@JmsListener注释方法的应用程序进行遥测和监视。

我已经注册了一个错误处理程序,用于接收消息时引发的异常,但是我想注册一个类似的错误处理程序,以监视我的应用程序与预订的主题之间的连接完整性。

我在setExceptionListener中发现了这个漂亮的AbstractMessageListenerContainter方法,但是DefaultJmsListenerContainerFactory没有提供用于设置此属性的配置方法。

我在Spring框架JMS javadocs中进行了搜索,以查看是否有关于为什么的任何解释。有人知道为什么不公开吗?

2 个答案:

答案 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);
        }
    }

}