【问题标题】:@JmsListener issue with durable subscription@JmsListener 持久订阅问题
【发布时间】:2019-08-18 23:07:35
【问题描述】:

我正在使用 Spring 的 @JmsListener (spring-jms-4.3.4.RELEASE.jar) 使用以下代码从 ActiveMQ 接收消息:

@Component
public class TopicSubscriber {
    @JmsListener(destination="xyz.topic1", subscription="xyz_topic_durable_subscription")
    public void send(Product product) {     
        System.out.println(" reveived message ***"+product);
    }
}

根据 Spring API 的文档(下面给出的链接),上面的代码应该创建一个订阅名称为 xyz_topic_durable_subscription 的持久订阅:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/annotation/JmsListener.html#subscription--

但是,问题是 上面的代码只创建了 Non-Durable 订阅,我可以通过使用管理控制台监视 ActiveMQ 找到它(在下面添加屏幕截图,在下面查找“xyz.topic1”目标'活跃的非持久主题订阅者'部分)。

是否需要对代码进行任何更改以进行持久订阅?

【问题讨论】:

    标签: java spring jms spring-jms


    【解决方案1】:

    您需要适当地配置 ListenerContainerFactory:

    @Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setPubSubDomain(true);
        factory.setSubscriptionDurable(true);
        factory.setClientId("jmsDemo");
        // This provides all boot's default to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        // You could still override some of Boot's default if necessary.
        return factory;
    }
    

    这里有有趣的部分:

        factory.setSubscriptionDurable(true);
        factory.setClientId("jmsDemo");
    

    现在,当您进入 ActiveMQ WebConsole 时,您应该会看到:

    【讨论】:

      【解决方案2】:

      在上面标记为正确的答案中,代码:

      factory.setPubSubDomain(true);
      factory.setSubscriptionDurable(true);
      factory.setClientId("jmsDemo");
      

      必须在之后

      configurer.configure(factory, connectionFactory);
      

      否则您将丢失这些设置。

      【讨论】:

      • 这个“配置器”是哪个类?你能分享更多细节吗?感谢 configurer.configure(factory, connectionFactory);
      • 我从programcreek.com/java-api-examples/…得到了示例代码
      • 'configurer' 是作为参数传入方法的 DefaultJmsListenerContainerFactoryConfigurer
      • 我发现我还必须将 bean 命名为 jmsListenerContainerFactory 才能覆盖默认值。
      【解决方案3】:

      您还需要配置侦听器容器工厂来为durable subscriptions 创建容器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-11
        • 2016-01-14
        • 2013-12-17
        • 1970-01-01
        • 2015-06-16
        • 2015-08-24
        • 1970-01-01
        • 2017-09-05
        相关资源
        最近更新 更多