为什么 DefaultJmsListenerContainerFactory 不公开 setExceptionListener 方法?

Why does DefaultJmsListenerContainerFactory not expose setExceptionListener method?

我正在为使用 DefaultJmsListenerContainerFactory 注册 @JmsListener 注释方法的应用程序构建遥测和监控过程。

我已经为接收消息时抛出的异常注册了一个错误处理程序,但我想注册一个类似的错误处理程序来监视我的应用与其订阅的主题之间的连接完整性。

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

我搜索了 spring 框架 JMS javadoc,看看是否有关于 为什么 此配置选项不存在的任何解释。有谁知道为什么没有公开的原因?

看起来像是遗漏,或者认为没有必要揭露的东西。我建议你打开一个 Improvement JIRA issue.

与此同时,您可以从 JmsListenerEndpointRegistry(使用 id)获取对容器的引用,转换它并设置 属性。

编辑

像这样的东西应该有用...

@Bean
public SmartInitializingSingleton lcPostProcessor(JmsListenerEndpointRegistry registry) {
    return () -> registry.getListenerContainers().forEach(c ->
            ((DefaultMessageListenerContainer) c).setExceptionListener(myExceptionListener()));
}

它在创建所有 bean 之后但在任何容器启动之前运行。

这是最终让我能够访问此属性的原因。我测试了还是可以像以前一样收到topic的消息

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

}