如何在Apache Camel中停止IBM MQ的JMS消费线程?
解决方案
你的问题核心是JMS InOut模式下,线程会阻塞到整个路由流程完成才释放,导致后续REST API调用占用JMS线程引发超时。可以通过线程切换让JMS线程及时释放,后续REST调用使用独立线程池处理。
路由修改方案
在JMS调用完成后,添加threads()组件切换线程池,修改后的路由代码如下:
from(Rutas.CONSUME_CUENTA_DETALLE) .routeId("CONSUME_CUENTA_DETALLE") .removeHeaders("*") .setHeader("CamelJmsDestinationName", constant("queue:///"+colaCuentaDetalle+"?targetClient=1")) .to("jms://queue:" + colaCuentaDetalle +"?exchangePattern=InOut" +"&useMessageIDAsCorrelationID=true" +"&replyToType=Temporary" +"&requestTimeout=3s" +"&asyncStopListener=true" +"&cacheLevelName=CACHE_CONSUMER") .id("Cuenta_detalle") // 切换到独立线程池处理后续逻辑,释放JMS线程 .threads() .removeHeader("*") .to(Rutas.VALIDATE_RESPONSE_CUENTA_DETALLE) .end();
关键说明
threads()组件会将后续的REST调用逻辑提交到Camel的默认线程池执行,原JMS线程在完成JMS回复接收后立即释放,不会被REST调用占用。- 若需要更精细的线程控制,可以自定义线程池参数,比如:
.threads().poolSize(3).maxPoolSize(10).keepAliveTime(60, TimeUnit.SECONDS) - 确保
requestTimeout=3s符合JMS队列的实际响应能力,避免JMS线程提前超时中断流程。 - 检查REST API调用的超时配置,确保与新线程池的执行逻辑匹配,避免REST自身超时。
内容的提问来源于stack exchange,提问作者Cristhian david Hoyos Trochez
相关产品推荐
相关产品推荐

