能否使用Topic Name而非Topic String连接IBM MQ?
使用Topic Name替代Topic String发送JMS消息?
当然可以用Topic Name对应的Topic对象替代直接传入字符串的方式,而且这是更规范的做法,还能提升代码的可维护性和灵活性。
两种实现方式:
提前配置Topic Bean并注入使用
先在配置类中注册Topic实例(以ActiveMQ为例,不同MQ厂商的Topic实现类略有差异):@Bean public Topic testTopic() { return new ActiveMQTopic("TEST_TOP"); }然后在业务代码中注入该Bean,调用
convertAndSend的重载方法:@Autowired private Topic testTopic; public String sendTopic() { try { log.info("Send message to topic"); jmsTemplate.convertAndSend(testTopic, "TEST SEND TO TOPIC"); log.info("Message sent to topic"); return "SEND OK"; } catch(JmsException ex){ ex.printStackTrace(); return "SEND FAIL"; } }动态解析Topic Name为Destination对象
如果不想提前配置Bean,也可以通过Spring的DestinationResolver动态解析Topic名称:public String sendTopic() { try { log.info("Send message to topic"); // 第三个参数false表示解析为Topic(true为Queue) Destination topic = jmsTemplate.getDestinationResolver() .resolveDestinationName(jmsTemplate.getConnectionFactory(), "TEST_TOP", false); jmsTemplate.convertAndSend(topic, "TEST SEND TO TOPIC"); log.info("Message sent to topic"); return "SEND OK"; } catch(JmsException ex){ ex.printStackTrace(); return "SEND FAIL"; } }
这么做的好处:
- 避免硬编码字符串,Topic名称可以统一管理,修改时只需改一处
- 明确指定目标是Topic,不会和Queue混淆(部分MQ需要在字符串前加
topic://前缀区分,用Topic对象可省略这种冗余写法) - 便于单元测试,可轻松替换为Mock Topic对象
内容的提问来源于stack exchange,提问作者user8779054
相关产品推荐
相关产品推荐

