Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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 Apache kafka高级消费者-了解_Java_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java Apache kafka高级消费者-了解

Java Apache kafka高级消费者-了解,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我一直在寻找ApacheKafka实现高级消费者(我不想处理消息,我只需要将数据放入MongoDB)v0.8.1.1 我已经看了下面的链接,这些链接显示了关于如何实现消费者的非常详细的信息 但我仍然不知道在所有线程都关闭后,消费者如何重新启动。例如,假设我有4个消费者线程正在运行,它们消耗了来自kafka broker的所有消息,因此,一旦没有消息,所有消费者将什么也不做,在特定超时后,它将被关闭,因此我不确定当kafka broker中有新消息时消费者如何再次重新启动 有人可以共享一些代码

我一直在寻找ApacheKafka实现高级消费者(我不想处理消息,我只需要将数据放入MongoDB)v0.8.1.1

我已经看了下面的链接,这些链接显示了关于如何实现消费者的非常详细的信息

但我仍然不知道在所有线程都关闭后,消费者如何重新启动。例如,假设我有4个消费者线程正在运行,它们消耗了来自kafka broker的所有消息,因此,一旦没有消息,所有消费者将什么也不做,在特定超时后,它将被关闭,因此我不确定当kafka broker中有新消息时消费者如何再次重新启动


有人可以共享一些代码或至少一些关于此的指针。还有一种方法,我们可以在一些回调方法中使用我们的业务逻辑,当有消息时,这些回调方法将被调用,而不是使用while循环。

我认为您可能误解了在关机期间使用超时。从理论上讲,无论事件间隔多长时间,您都在消耗无限多的事件流,因此您的consuner永远不应该关闭,除非您正在更新代码或机器崩溃。在实际需要关闭使用者的情况下,10000毫秒超时的作用是给Kafka使用者足够的时间将其最后读取的偏移量写入ZooKeeper,以便使用者重新启动时,它将从其处理的最后一个偏移量恢复。此使用者关闭通常发生在程序关闭时(可能捕获到InterruptedException),而不仅仅是使用者。因此,当程序重新启动时,consuner将重新启动

编辑

我应该补充一点,卡夫卡的消费主义者遵循这种永无止境的消费模式的原因。迭代器的下一个方法将始终阻塞,直到它可以读取下一条消息。因此,在本例中,达到超时的唯一方法是如果使用者线程因某种异常而关闭

编辑2

我还没有看到任何Kafka消费者API支持回调。我认为您现在唯一的选择是编写自己的回调实现,例如:

public interface Callback {
  void call(MessageAndMetadata message);
}

Executor executor = Executors.newCachedThreadPool();
final Callback<byte[], byte[]> callback = new MyCallback();
while (it.hasNext()) {
  final MessageAndMetadata message = it.next();
  executor.submit(new Runnable() {
    public void run() {
      callback.call(message);
    }
  });
}
公共接口回调{
void调用(MessageAndMetadata消息);
}
Executor Executor=Executors.newCachedThreadPool();
最终回调=新的MyCallback();
while(it.hasNext()){
final MessageAndMetadata message=it.next();
执行者提交(新的可运行(){
公开募捐{
callback.call(消息);
}
});
}

您可能对它们感兴趣,但我认为我在重写过程中没有看到回调(尽管我可能是错的)。

好的,这意味着消费者永远不会关机,除非程序关机或出现异常。。。对吗?还有另一个问题呢,我可以用回调方法代替while循环吗?谢谢你的解释,你不觉得文档有点混乱吗?是的,它看起来有点不清楚。我认为在消费者群体教程中提供的第一个示例之后的部分应该定义行为:“这里有趣的部分是
while(it.hasNext())
部分。基本上,这段代码从卡夫卡读取,直到你停止它。”的确,如果主题中没有消息,并且您从未明确停止消费者线程,卡夫卡将永久阻止。