Apache Camel JMS路由未回复消息:如何配置为InOut模式?
搞定Apache Camel JMS路由的InOut模式配置
嘿,我来帮你解决这个问题!你的程序挂起本质是:发送端用了请求-响应(InOut)模式,但你的Camel路由默认是单向消费(InOnly)模式——只收消息不回复,导致发送端一直卡在那儿等回复。下面给你两种简单的配置方法,把路由改成InOut模式:
方法1:在JMS端点URI直接指定模式
最直接的方式是在JMS端点的URI里加上exchangePattern=InOut,让整个路由默认用InOut模式处理消息:
@Component("testRouteBuilder") public class TestRouteBuilder extends RouteBuilder { @SuppressWarnings("unchecked") @Override public void configure() throws Exception { // 给JMS端点添加exchangePattern=InOut参数启用InOut模式 from("jms:queue:inputQueue?exchangePattern=InOut") .process(exchange -> { // 这里写你的消息处理逻辑 String inputMsg = exchange.getIn().getBody(String.class); String responseMsg = "已处理消息:" + inputMsg; // 设置回复内容,Camel会自动发送到replyTo地址 exchange.getOut().setBody(responseMsg); }); } }
方法2:在路由中强制设置交换模式
如果不想在URI里写参数,也可以在路由流程里用setExchangePattern()方法手动切换成InOut模式:
@Component("testRouteBuilder") public class TestRouteBuilder extends RouteBuilder { @SuppressWarnings("unchecked") @Override public void configure() throws Exception { from("jms:queue:inputQueue") // 强制将交换模式设置为InOut .setExchangePattern(ExchangePattern.InOut) .process(exchange -> { String inputMsg = exchange.getIn().getBody(String.class); String responseMsg = "已处理消息:" + inputMsg; exchange.getOut().setBody(responseMsg); }); } }
关键注意点
- 不管用哪种方式,处理完消息后一定要把回复内容放到
exchange.getOut()(或者exchange.getMessage())里,Camel会自动把这个回复发送到JMS消息头指定的replyTo地址,不管是持久队列还是临时目的地都能正常响应。 - 配置完成后,发送端就能收到预期的回复,不会再挂起等待了。
内容的提问来源于stack exchange,提问作者Tuomas Toivonen
相关产品推荐
相关产品推荐

