实用指南:疑难bug之正确处理InterruptedException

目录

问题出自:

java中断原理:

解决方法:


问题出自:

在rabbitmq 的消费者处理消息体,捕获中断异常同时重新进行中断,导致消费线程停止。

我们业务代码中有中断响应,通过catch捕获了这种中断,简单按照sonar扫描给出的建议调用Thread.currentThread().interrupt();结果直接给消费线程停止了。

catch (InterruptedException e) {
    log.error("busi error:{}", e.getMessage(), e);
    //业务异常,无法重试,不重新入队列
    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
    //Thread.currentThread().interrupt();会导致消费端无法正常消费
}

Thread.currentThread().interrupt(); 方法重新进行了中断即消费线程中断标记为true,导致rabbitmq的当前消费线程停止不再处理消息。

java中断原理:

  • java中断响应是描述当一个线程或方法A处于运行、阻塞或死锁状态时,外界(通常指其他线程、系统IO等)对A的影响能否让A线程或者方法抛出InterruptedException异常并提前返回,如果会提前返回并且抛出InterruptedException,就叫可中断响应途径或线程,要是不会抛出InterruptedException,就叫不可中断线程或方法。

  • 每个线程都有一个与线程是否已中断的相关联的 Boolean 属性,用于表示线程的中断状态(interrupted status)。中断状态初始时为 fals
posted @ 2025-09-27 20:11  wzzkaifa  阅读(11)  评论(0)    收藏  举报