【问题标题】:Configuring multiple DefaultJmslistenercontainerfactory配置多个 DefaultJmslistenercontainerfactory
【发布时间】:2016-02-01 04:32:26
【问题描述】:

在我的应用程序中,我有 2 个 diff mq conn factory beans。为此,我有 2 个差异 DefaultJmslistenercontainerfactory bean ex cf1 n cf2。每个 DefaultJmslistenercontainerfactory bean 都在单独的 @JmsListener 中引用。 ..现在我想以编程方式开始停止每个listrner,因为我正在覆盖configureMessageListeners(JmsListenerRegistrar)方法,我可以在其中设置DefaultJmslistenercontainerfactory 实例。注意我只能设置一个实例.. 然后在我的代码中,我得到了 JmsListenerRegistry 的 spring 实例,我可以从中获取列表 dmlc ..我可以开始 n 停止 然而。 .因为我只设置了一个 DefaultJmslistenercontainerfactory 实例,我的代码只返回一个 dmlc .. 这里的问题是如何在 configureJmsListener() 方法中传递多个 DefaultJmslistenercontainerfactory 实例? 注意-我不手动创建 dmlc..我只是配置工厂..

【问题讨论】:

    标签: spring jms spring-jms


    【解决方案1】:

    您为什么使用 configureMessageListeners() ?那是为了程序化的端点注册,不影响@JmsListener的配置。

    显示您的配置(编辑问题,不要尝试在 cmets 中发布代码/配置)

    这对我来说很好......

    @Bean
    public JmsListenerContainerFactory<DefaultMessageListenerContainer> one(
            @Qualifier("jmsConnectionFactory1") ConnectionFactory cf) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(cf);
        return factory;
    }
    
    @Bean
    public JmsListenerContainerFactory<DefaultMessageListenerContainer> two(
            @Qualifier("jmsConnectionFactory2") ConnectionFactory cf) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(cf);
        return factory;
    }
    
    @JmsListener(id="fooListener", destination="foo", containerFactory="one")
    public void listen1(String payload) {
        System.out.println(payload + "foo");
    }
    
    @JmsListener(id="barListener", destination="bar", containerFactory="two")
    public void listen2(String payload) {
        System.out.println(payload + "bar");
    }
    

    ...

    @Autowired
    JmsListenerEndpointRegistry registry;
    

    ...

    MessageListenerContainer fooContainer = registry.getListenerContainer("fooListener");
    MessageListenerContainer barContainer = registry.getListenerContainer("barListener");
    

    您也可以使用registry.getListenerContainers() 获取收藏。

    我以为我在 my answer to your other question 中解释了所有这些。

    【讨论】:

    • 是的,得到了​​你的答案。我认为它会为不同的 DefaultJmsListenerContainerFactory 实例创建多个注册表。有什么办法可以动态获取监听器的 id 吗?我想在屏幕上显示侦听器的 ID 及其运行状态。 MessageListenerContainer 不提供该 api
    • 目前没有 API 来获取侦听器容器 ID 的列表。我打开了一个JIRA Issue,你可以跟踪它。
    • this answer该功能应该很快就会可用。
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2011-10-09
    相关资源
    最近更新 更多