0、查看RocketMQ控制台,如下图,消息延迟为80,表名目前有80条消息未被正常消费,所以消息到达了消费端,需要排查消费端原因,因为我们使用的顺序消费模式,所以判断某个队列内有消息未返回正常的消费状态导致该队列之后的所有消息处理堵塞排队的状态。
1、ps -ef | grep java 查看消费者服务占用的 pid
2、jstack pin > 1.log 把服务上的线程状态输出到当前目录下的1.log
3、查看线程日志文件
2步骤中的命令多执行几次,如果某个线程一直处理RUNNABLE状态,说明此线程一直被占用,如上图所示,执行多次后 ConsumeMessageThread_2 一直处于RUNNABLE 状态,根据调用栈可以看出具体的业务代码行数,我的问题出现在请求第三方服务的HTTP请求中,经排查,此请求未设置HTTP请求的超时时间,导致请求线程不能释放,而消费者是实现了MessageListenerOrderly的顺序消费队列,此消息未被正常消费导致队列内的所有后面的消息都堵塞了。
设置了HTTP请求超时时间后,消息消费正常。