使用JmsSendingMessageHandler如何从消息头动态获取JMS目标地址?
JmsSendingMessageHandler 动态读取消息头目标地址解决方案
Spring Integration 提供的 JmsSendingMessageHandler 未提供 setDestinationExpressionString 方法,但可以通过传入SpEL表达式对象实现从消息头动态读取目标地址,以下是两种可行实现方案:
方案1:直接配置SpEL动态目的地表达式
通过SpelExpressionParser解析表达式字符串,传入setDestinationExpression方法即可实现需求:
import org.springframework.expression.spel.standard.SpelExpressionParser; @Bean @ServiceActivator(inputChannel = "outMessageChannel" ) private MessageHandler jmsOutboundHandler() { JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory()); // 如果目标为topic类型,需额外配置:jmsTemplate.setPubSubDomain(true); JmsSendingMessageHandler messageHandler = new JmsSendingMessageHandler(jmsTemplate); // 解析从消息头获取destination_name字段的SpEL表达式 messageHandler.setDestinationExpression(new SpelExpressionParser().parseExpression("headers['destination_name']")); return messageHandler; }
表达式支持返回两种类型的结果:
- 字符串类型:框架会自动调用JmsTemplate内置的
DestinationResolver转换为实际的队列/主题对象 - 直接返回
Destination类型对象:框架会直接使用该对象作为发送目标
方案2:自定义动态目的地解析逻辑
如果需要对目标地址做额外加工(比如按环境拼接前缀、白名校验等),可以自定义DestinationResolver实现:
import org.springframework.jms.support.destination.DestinationResolver; import jakarta.jms.Destination; import jakarta.jms.JMSException; import jakarta.jms.Session; public class CustomDynamicDestinationResolver implements DestinationResolver { @Override public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException { // 自定义加工逻辑示例:为测试环境的目的地添加dev前缀 String processedDestName = "dev_" + destinationName; // 根据类型创建队列或主题 if (pubSubDomain) { return session.createTopic(processedDestName); } return session.createQueue(processedDestName); } }
将自定义解析器绑定到JmsTemplate即可生效:
@Bean @ServiceActivator(inputChannel = "outMessageChannel" ) private MessageHandler jmsOutboundHandler() { JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory()); jmsTemplate.setDestinationResolver(new CustomDynamicDestinationResolver()); JmsSendingMessageHandler messageHandler = new JmsSendingMessageHandler(jmsTemplate); messageHandler.setDestinationExpression(new SpelExpressionParser().parseExpression("headers['destination_name']")); return messageHandler; }
内容的提问来源于stack exchange,提问作者Pratik Dhole
相关产品推荐
相关产品推荐

