【问题标题】:DefaultJmsListenerContainerFactory vs DefaultMessageListenerContainerDefaultJmsListenerContainerFactory 与 DefaultMessageListenerContainer
【发布时间】:2015-10-31 22:27:47
【问题描述】:

使用DefaultJmsListenerContainerFactoryDefaultMessageListenerContainer 相比有什么优势?

  • 如果我直接配置 DMLC,我会通过调用isRunning() 来检查状态。我也得到了启动和停止 DMLC 的设施

  • 但是,根据新的 spring 规范,如果我配置 DefaultJmsListenerContainerFactory ,我无法获得 DMLC 的句柄,因此我无法执行上述任何操作。

看到上述限制,有人可以解释为什么应该使用DefaultJmsListenerContainerFactory 而不是 DMLC

另外,如果我使用DefaultJmsListenerContainerFactory,有什么方法可以实现上述功能?

【问题讨论】:

    标签: spring spring-boot spring-jms


    【解决方案1】:

    引入工厂是为了支持为 @JmsListener 带注释的 POJO 方法创建侦听器容器。

    如果您不使用该机制,您可以继续直接定义您的 DLMC。

    编辑

    当使用@JmsListener时,容器本身并没有注册为bean,但是可以使用注册bean;您可以获得对容器的引用,以便您可以启动/停止等。

    请参阅 javadocs 以了解 JmsListenerEndpointRegistry 以了解如何通过 id 单独或全部获取对容器的引用。

    EDIT2

    我不确定您在评论 3 中的意思;注册中心拥有所有容器,无论使用哪个容器工厂创建容器...

    @JmsListener(id="foo", destination="foo", containerFactory="one")
    public void listen1(String payload) {
        System.out.println(payload + "foo");
    }
    
    @JmsListener(id="bar", destination="bar", containerFactory="two")
    public void listen2(String payload) {
        System.out.println(payload + "bar");
    }
    

    如果您使用configureListenerContainers() 以编程方式创建端点,则必须为它们提供容器而不是容器工厂。

    【讨论】:

    • 我正在使用@JmsListener ...但是在这种情况下也应该有一些手动启动和停止监听器的句柄
    • 我尝试了上述方法,它奏效了。但是,在我的应用程序中,我将创建两个 DefaultJmsListenerContainerFactory 实例,因为我有两个 diff QM。在这种情况下,如何从 configureJmsListeners 方法中添加两个工厂?
    • 查看我的下一个编辑。通常最好提出一个新问题,而不是评论一个封闭的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2012-09-16
    • 2012-08-16
    相关资源
    最近更新 更多