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();
}
}
为什么KafkaConsumerpoll()
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。不确定是什么原因造成的。