该问题也是非常的严重,没有合适处理即导致消息丢失;
解决方案
设置连接工厂配置
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setChannelCheckoutTimeout(30000);
解析
该报错根本原因是**”连接池连接不足“**,但重要原因是为什么不能像数据库连接池一样,即使连接不够了不能有一定策略去等待连接。
问题一:为什么这么容易channe不足
从源码channel的回收来看他是异步回收连接的,这意味着即使你轮询同步的方式去推送mq,也会因为推送速度过快,channel还没被异步回收导致异常。
且至和没有合适的获取连接失败策略
问题二:channelCheckoutTimeout参数的意义
该参数的官方语义是:
当 ChannelCheckoutTimeout 的值大于 0 的时候,ChannelCacheSize 的值就是最大的 channel 数量了,一旦从缓存中获取不到 channel,等待 ChannelCheckoutTimeout 毫秒后,如果还是获取不到的,就会抛 AmqpTimeoutException 了。\
对于该报错的变相意义就是,获取连接有了最大等待时间;
而该报错正因为获取连接与释放连接速率不匹配,而多出的等待时间为不匹配的速率提供了缓冲;
其他解决方案
对于该报错直接报错意义就是,连接池不够用了,那么直接增加连接池大小虽然也不合理但合适的大小也可以解决该问题:
参考:https://blog.csdn.net/qq_35374224/article/details/106721801