首页 > 解决方案 > Spring Boot + ActiveMQ 以编程方式即时订阅主题

问题描述

我正在尝试实现一个功能,我拥有的侦听器类可以订阅/取消订阅 JMS 主题。经过一些研究,没有明确的方法可以做到这一点,我提出了两种解决方案:

  1. 有一个监听器类,它包含一个字符串主题名称列表,并定期运行它应该订阅的所有这些主题并jmsTemplate.receiveAndConvert(topicName)在每个主题上运行阻塞(可能将阻塞操作本身委托给工作池)。订阅/取消订阅主题就像从列表中删除主题名称一样简单。
  2. 有一个工厂类,它将为应用程序需要订阅的每个主题构建一个新的侦听器,使用如下方法:

    public MessageListenerContainer createListener(String topic) {
      DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
      container.setConnectionFactory(connectionFactory());
      container.setDestinationName(topic);
      container.setMessageListener(new MyListenerClass());
      return container;
    

    }

第二个选项对我来说似乎更优雅,但我不确定听众的生命周期。我浏览了一些 Spring Boot 的 jms 和 activemq 模块的源代码,并注意到它们DefaultMessageListenerContainer有方法initialize()start()虽然我不确定如何/是否需要使用这些方法,因为我能找到以MessageListenerContainer这种方式构建的唯一方法是Bean宣言。此外,当取消订阅某个主题,因此想要销毁与其关联的侦听器容器时,除了调用该方法之外,是否需要做更多的事情stop(callback)

我对 JMS/ActiveMQ 及其 Spring 集成的理解是否正确,因为没有更简单的方法可以实现这一点?我的方法正确吗?

标签: javaspringspring-bootactivemqspring-jms

解决方案


恕我直言,只要你

  • 从spring获取connectionFactory(不是一个PooledConnectionFactory
  • 正确调用initialise()start()订阅并stop()取消订阅
  • 发生异常时不要期望消息重新传递

第二种方法应该一切都很好


推荐阅读