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

