You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:09:00