java - Spring Boot + ActiveMQ 以编程方式即时订阅主题
问题描述
我正在尝试实现一个功能,我拥有的侦听器类可以订阅/取消订阅 JMS 主题。经过一些研究,没有明确的方法可以做到这一点,我提出了两种解决方案:
- 有一个监听器类,它包含一个字符串主题名称列表,并定期运行它应该订阅的所有这些主题并
jmsTemplate.receiveAndConvert(topicName)
在每个主题上运行阻塞(可能将阻塞操作本身委托给工作池)。订阅/取消订阅主题就像从列表中删除主题名称一样简单。 有一个工厂类,它将为应用程序需要订阅的每个主题构建一个新的侦听器,使用如下方法:
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 集成的理解是否正确,因为没有更简单的方法可以实现这一点?我的方法正确吗?
解决方案
恕我直言,只要你
- 从spring获取connectionFactory(不是一个
PooledConnectionFactory
) - 正确调用
initialise()
和start()
订阅并stop()
取消订阅 - 发生异常时不要期望消息重新传递
第二种方法应该一切都很好
推荐阅读
- javascript - Python - Selenium - 无法在页面上找到元素
- sql - Excel SQL 连接:根据单元格值进行查询更新
- mips - MIPS bgt 指令
- php - 使用 .htaccess 重定向 URL,不包括图像文件夹
- python - Plotly Dash - 在 dcc.graph 中向图形添加标题时出现语法错误
- css - FontAwesome 5 使用伪元素和附加类
- java - Spring Boot - 请求映射不接受斜杠或多个目录
- java - Stirng[] 无法转换为字符串
- spring-integration - 如何使用 Spring Integration 设置 ThreadPool 来处理文件消息源?
- ios - 使用 iPhone X Truedepth 构建人脸的 3D 对象