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

ActiveMQ Classic环境下Camel路由消费消息随机延迟问题求助

问题:ActiveMQ缓存连接工厂会话缓存过大导致消息延迟

背景

  • 我们有一个基于Apache Camel和IBM MQ的集成应用,开发阶段需要在本地笔记本运行。
  • 多数开发者使用搭载Apple M1处理器的MacBook,无法运行IBM MQ的Docker容器(IBM暂不支持M1)。
  • 曾考虑在AWS上启动EC2实例部署IBM MQ并通过SSH连接,但每个开发者单独使用EC2既不便又增加成本,因此决定采用ActiveMQ Classic 5.11.1作为本地消息中间件。
  • 通过配置,应用可根据设置创建ActiveMQ或IBM MQ连接工厂,同时使用对应JMS组件并以相同Key添加到Camel上下文,确保路由定义无需变更:
    var jmsComponent = useActiveMq ? activeMqComponent(cf) : new JmsComponent(new JmsConfiguration(cf));
    jmsComponent.setTransactionManager(platformTransactionManager);
    camelContext.addComponent(key, jmsComponent);
    

问题现象

  • 整体运行符合预期,但测试发现:通过ActiveMQ管理界面手动发送消息时,多数情况下能被即时消费,但一段时间后会出现消息延迟数分钟才被消费的情况,无明显规律,且一旦出现便持续如此。
  • 使用IBM MQ时未出现该问题,暂无法确定是ActiveMQ服务端、管理界面还是路由配置导致。
  • 重启应用后消息可被快速消费,所有路由均为事务型。

排查过程

  • 最初使用spring-boot-starter-activemq传递依赖的5.16.5版本,但因存在3个漏洞被CI服务器拒绝,切换至5.17.3后问题依旧。
  • 注1:将某条Camel路由替换为Spring的@JmsListener组件后,仍存在随机延迟,说明问题与Apache Camel无关。
  • 注2:修改连接工厂配置后问题解决:将ActiveMQ对应的缓存连接工厂会话缓存大小设为1(模拟无缓存),此后消息可即时被消费。

需求

现需解析缓存大小设为500时触发问题的原因,相关配置代码如下:

private CachingConnectionFactory cachedConnectionFactory(ConnectionFactory mqQueueConnectionFactory) {
    var cachingConnectionFactory = new CachingConnectionFactory();
    cachingConnectionFactory.setTargetConnectionFactory(mqQueueConnectionFactory);
    cachingConnectionFactory.setReconnectOnException(true);
    // We don't want a cached connection factory when using ActiveMQ
    // The easiest way to achieve this is without complicating too
    // much our implementation is by setting the cache size to 1
    cachingConnectionFactory.setSessionCacheSize(useActiveMq ? 1 : 500);
    cachingConnectionFactory.setExceptionListener(e -> log.error("ErrorResponse making connection with MQ", e));
    return cachingConnectionFactory;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:40:36