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

Camel自定义Header未存入JMS消息属性问题咨询

嘿,我来帮你搞定这个问题~你遇到的是Apache Camel JMS组件默认的Header过滤机制在搞鬼——默认情况下,Camel不会自动把自定义的Camel Headers映射到JMS消息属性里,下面给你几个实用的解决方案:

解决方案1:显式映射自定义Header到JMS属性

最简单的方式就是在路由里直接设置自定义Header,只要没被过滤,Camel会自动把它转为JMS消息属性。你甚至可以不用写复杂的process块,用setHeader就能完成:

rest("/query-set")
    .id("queryset-route")
    .get("{id}")
    .route()
        // 直接生成UUID并设置为自定义Header
        .setHeader("myHeader", simple("${randomUUID}"))
        .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200))
    .endParent()
    .marshal().json(JsonLibrary.Jackson)
    // 补全exchangePattern,比如InOnly(单向发送到队列)
    .to("jms:queue:querysetRequests?exchangePattern=InOnly");

如果一定要保留process块,也可以直接在里面设置Header,效果是一样的:

rest("/query-set")
    .id("queryset-route")
    .get("{id}")
    .route()
        .process((exchange) -> {
            String uuid = UUID.randomUUID().toString();
            exchange.getIn().setHeader("myHeader", uuid);
        })
        .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200))
    .endParent()
    .marshal().json(JsonLibrary.Jackson)
    .to("jms:queue:querysetRequests?exchangePattern=InOnly");

解决方案2:配置JMS组件的Header过滤策略

如果需要传递多个自定义Headers,不想一个个手动设置,可以修改JMS组件的Header过滤策略,允许自定义Headers通过。

比如在你的Spring配置类里定义JMS组件:

@Bean
public JmsComponent jmsComponent(ConnectionFactory connectionFactory) {
    JmsComponent jmsComponent = new JmsComponent();
    jmsComponent.setConnectionFactory(connectionFactory);
    
    // 创建自定义过滤策略
    DefaultJmsHeaderFilterStrategy filterStrategy = new DefaultJmsHeaderFilterStrategy();
    // 取消出站Header过滤,允许所有非Camel内部的Headers传递
    filterStrategy.setOutFilterPattern(null);
    // 也可以精准指定允许的Header,比如只允许myHeader:
    // filterStrategy.setAllowedOutHeaders(Collections.singleton("myHeader"));
    
    jmsComponent.setHeaderFilterStrategy(filterStrategy);
    return jmsComponent;
}

这样配置后,所有你自定义的Headers都会自动被转为JMS消息属性,不用再单独处理。

解决方案3:使用transferExchange(不推荐生产环境)

如果你想把整个Exchange的所有内容(包括所有Headers、属性甚至Camel内部信息)都传递过去,可以在JMS端点URL里加transferExchange=true:

.to("jms:queue:querysetRequests?exchangePattern=InOnly&transferExchange=true");

不过这个方式会序列化整个Camel Exchange,消息体积会变大,而且耦合性很高,只适合测试场景,不推荐在生产环境使用。

最后提醒下:你原代码里的exchangePattern=In...没写完,记得补全成InOnly(单向发送到队列,不需要响应)或者InOut(需要队列返回响应),根据你的业务需求选择。

内容的提问来源于stack exchange,提问作者JointEffort

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:39:56