Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么卡夫卡消费者不';轮询()时是否使用jdk InterruptedException?_Java_Apache Kafka_Kafka Consumer Api_Interrupted Exception - Fatal编程技术网

Java 为什么卡夫卡消费者不';轮询()时是否使用jdk InterruptedException?

Java 为什么卡夫卡消费者不';轮询()时是否使用jdk InterruptedException?,java,apache-kafka,kafka-consumer-api,interrupted-exception,Java,Apache Kafka,Kafka Consumer Api,Interrupted Exception,我注意到主张使用wakeup()和自定义布尔值来关闭KafkaConsumer: public class KafkaConsumerRunner implements Runnable { private final AtomicBoolean closed = new AtomicBoolean(false); private final KafkaConsumer consumer; public KafkaConsumerRunner(KafkaCons

我注意到主张使用
wakeup()
和自定义布尔值来关闭KafkaConsumer:

 public class KafkaConsumerRunner implements Runnable {
     private final AtomicBoolean closed = new AtomicBoolean(false);
     private final KafkaConsumer consumer;

     public KafkaConsumerRunner(KafkaConsumer consumer) {
       this.consumer = consumer;
     }

     public void run() {
         try {
             consumer.subscribe(Arrays.asList("topic"));
             while (!closed.get()) {
                 ConsumerRecords records = consumer.poll(Duration.ofMillis(10000));
                 // Handle new records
             }
         } catch (WakeupException e) {
             // Ignore exception if closing
             if (!closed.get()) throw e;
         } finally {
             consumer.close();
         }
     }

     // Shutdown hook which can be called from a separate thread
     public void shutdown() {
         closed.set(true);
         consumer.wakeup();
     }
 }
为什么KafkaConsumer
poll()
method不抛出jdk InterruptedException,那么我们可以只处理InterruptedException,从而避免使用以下两个步骤编写shutdown方法:

         closed.set(true);
         consumer.wakeup();
卡夫卡解释说:

请注意,虽然可以使用线程中断而不是wakeup()来中止阻塞操作(在这种情况下,将引发InterruptException),但我们不鼓励使用它们,因为它们可能会导致终止使用者的完全关闭。中断主要支持不可能使用wakeup()的情况,例如,当使用者线程由不知道Kafka客户端的代码管理时

但事实上,我并没有意识到它的意义。有人能更明确地解释一下吗

此外,
poll()
抛出
org.apache.kafka.common.errors.InterruptException
,它是jdk InterruptedException的未经检查的包装。为什么要麻烦使用这个新的异常呢


非常感谢您的建议。

您找到答案了吗?我也面临一个问题,有时在consumer.poll()上,我会得到org.apache.kafka.common.errors.InterruptException。不确定是什么原因造成的。