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
相关产品推荐
相关产品推荐

