昨天下午测试发了6条消息,今天发现还在消费中。从日志看,代码一直在正常处理中并非阻塞。
这几条消息特点是很大,一条消息里有8500条数据,一条数据处理耗时约300ms,那么一条消息耗时约2,550秒。按道理一晚上肯定消费完了,但是今天还是6条消息。从日志看,发现同一条消息一直在重复消费中。
我在开发环境上重现了此问题
怀疑消息没有被正常ACK,查看消费端代码,是自动提交,那么是什么原因导致消息没有提交呢?
发现12:30分有点异常,根据经验估计是消费端断连重连了,这可能导致消息没提交。
注:自动提交并不是立即提交的,而是定时提交的。
日志里也找到一个连接异常,一般是网络原因导致:
13:01:04,973 WARN [AMQP Connection 161.189.77.69:5671] c.r.c.impl.ForgivingExceptionHandler [ForgivingExceptionHandler.java : 115] An unexpected connection driver error occurred (Exception message: Connection reset)
但是这个时间和上面图对不上,而且断连导致没提交也不会这么巧,每次都在提交前刚好断连了
继续找异常日志:
11:59:42,935 ERROR [AMQP Connection 161.189.77.69:5671] o.s.a.r.c.CachingConnectionFactory [AbstractConnectionFactory.java : 748] Shutdown Signal: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more, class-id=0, method-id=0)
这条日志直接解释了没提交的原因,消息处理时间超过了1800秒,之前不知道还有这种限制
修改方案:设置消费者超时时长
container.setConsumerTimeout(3600000); // 例如设置为1小时