MQ CachingConnectionFactory SessionCache不起作用

问题描述

我有一个局限性,我只能听到1个kafka主题分区,我可以监听并且仍然需要提高消息处理的吞吐量并在该处理过程中最终发送该消息MQ。

因此,一旦我在kafkaListener中接收到消息,便使用Asycn进行进一步处理(即将消息存储在Db中,然后发布到MQ)。

问题是,我看到会话缓存无法正常工作,因为一旦我从kafkalistner中读取内容,它就会打开一个新线程来做进一步的工作,并且一旦到达JMS send方法,在某点之后我会以MQ错误结尾“最大连接数达到通道容量“我瘦了MQRC 2537

不确定会出现什么问题,我正在使用com.ibm.mq / mq-jms-spring-boot-starter作为依赖项

我将Session cache设置为20,将Async设置为30,这是否意味着如果所有30个线程任务几乎同时出现,它将仍然尝试创建10个JMS连接

我对SessionCache的理解是,仅将创建..max个最大会话连接,并且30个..10个线程中的每个都需要等待JMS会话可用

请协助,我们正在使用Spring boot

解决方法

我认为这里的问题是您最终打开了太多连接。 spring-jms在后台为您完成所有池化,看来您的池大小超过了通道配置的连接数。

您需要通过减少连接池来应用限制。您可以为 mq-jms-spring-boot-starter 设置缓存属性。见https://github.com/ibm-messaging/mq-jms-spring

例如

ibm.mq.pool.enabled=true
ibm.mq.pool.maxConnections=5
ibm.mq.pool.blockIfFull=true
ibm.mq.pool.blockIfFullTimeout=60

您需要为您的环境确定合理的值。