Camel中使用ProducerTemplate发送JMS消息时如何获取返回的JMSMessageID
Camel JMS发送后获取JMSMessageID解决方案
1. 参数有效性确认
includeSentJMSMessageID参数完全符合你的需求,该参数在InOnly模式下会自动填充JMS客户端返回的实际JMSMessageID到Camel Exchange中,你的代码中已经指定了ExchangePattern.InOnly,满足该参数的生效条件。
2. 无法取值的原因
你调用的sendBody方法为无返回值方法,发送过程中生成的携带JMSMessageID的Exchange对象没有被捕获,该属性不会自动回写到你调用方法时持有的原始Exchange对象中,因此你在原始Exchange中找不到对应值。
3. 正确获取方式
JMSMessageID会存储在Producer发送完成后返回的Exchange的消息头中,对应的key为JMSMessageID,也可以直接引用Camel JMS组件常量org.apache.camel.component.jms.JmsConstants.JMS_MESSAGE_ID取值,示例代码如下:
ProducerTemplate producerTemplate = exchange.getContext().createProducerTemplate(); // 调用send方法接收返回的Exchange对象 Exchange sentExchange = producerTemplate.send( "endpointqueue?includeSentJMSMessageID=true", ExchangePattern.InOnly, ex -> ex.getIn().setBody(body) ); // 从返回的Exchange中提取JMSMessageID String jmsMessageId = sentExchange.getMessage().getHeader("JMSMessageID", String.class);
4. 异常场景排查
如果按上述方式仍然无法获取到值,可以按以下项逐一排查:
- 确认使用的Camel版本不低于2.12,
includeSentJMSMessageID为2.12版本新增配置 - 检查是否配置了自定义消息头过滤规则,确认
JMSMessageID没有被列入排除列表 - IBM MQ场景下可额外添加
jmsProvider=ibmmq到Endpoint配置末尾,明确指定JMS提供商避免适配异常
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

