【发布时间】:2017-02-08 02:30:59
【问题描述】:
我正在编写一个 Spring Boot 应用程序,它将监听一个或多个 JMS 主题。我们为 JMS 实现选择了 ActiveMQ。
我们主要关心的是性能和可扩展性。我们预计每秒可能有数千条消息到达。我们提出了两种选择:
-
使用单个主题和单个 @JmsListener 方法。在侦听器内部,检查 JMS 属性以确定处理消息的正确策略。
@JmsListener(destination = "response", containerFactory = "myTopicFactory") public void onMessage(Message message) throws IOException { message.getProperty("message.type") JmsHandler handler = messageStrategyMap.get(messageType); handler.handle(message); } -
使用多个主题和多个@JmsListener 方法。在这种情况下不需要切换逻辑。
@JmsListener(destination = "responseType1", containerFactory = "myTopicFactory") public void onMessage1(Message message) throws IOException { // Handle message type 1 } @JmsListener(destination = "responseType2", containerFactory = "myTopicFactory") public void onMessage2(Message message) throws IOException { // Handle message type 2 }
方法#1 的一个优点是无需管理多个目的地的资源;只有一个目的地。这也意味着协作系统只需要了解一个主题。
方法#2 的一个优点是不需要任何类型的切换逻辑。进入主题 A 的任何消息都有一个专门为主题 A 格式化的有效负载。这种方法的问题是处理传入消息的资源可能无法在不同的 JMS 侦听器之间有效分配。
此外,感谢任何有关容器工厂配置的建议。
【问题讨论】:
标签: java jms activemq scalability spring-jms