Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 需要Spring Kafka KafkaTemplate.flush()吗?_Java_Apache Kafka_Spring Kafka - Fatal编程技术网

Java 需要Spring Kafka KafkaTemplate.flush()吗?

Java 需要Spring Kafka KafkaTemplate.flush()吗?,java,apache-kafka,spring-kafka,Java,Apache Kafka,Spring Kafka,我是第一次使用SpringKafka,我使用SpringKafka创建了一个生产者和消费者。我让kafka服务器在本地主机上运行,并创建了一个名为test的主题。我无法通过简单的呼叫向消费者发送消息 KafkaTemplate.send(topicName,Data); 在同一个对象上调用send之后,我必须在kafkaTemplate上调用flush(),然后消费者才能接收数据。好吧,它很管用,非常棒。但谁能向我解释一下幕后发生了什么?为什么需要调用flush方法 来自官方的

我是第一次使用SpringKafka,我使用SpringKafka创建了一个生产者和消费者。我让kafka服务器在本地主机上运行,并创建了一个名为test的主题。我无法通过简单的呼叫向消费者发送消息

        KafkaTemplate.send(topicName,Data);
在同一个对象上调用send之后,我必须在kafkaTemplate上调用flush(),然后消费者才能接收数据。好吧,它很管用,非常棒。但谁能向我解释一下幕后发生了什么?为什么需要调用flush方法

来自官方的春季卡夫卡文档

           public void flush()
冲洗生产商。 注意,只有当ProducerFactory提供单例生产者(如DefaultKafkaProducerFactory)时,才有意义调用此方法


提前感谢。

生产者的实现是异步的。消息存储在内部队列中,等待内部线程发送,这将通过潜在的批处理提高效率

所以,当程序退出时,消息可能会留在客户机内存中。在本例中,Kafka服务器实际上不接收这些消息

消息将在队列.buffering.max.ms或其他大小/数量限制定义的超时时间内发送


flush
强制将发送队列中的所有消息传递到服务器。

感谢您的回答。因此,如果我不刷新并且程序退出,消息何时才能真正传递?我知道你提到了queue.buffering.max.ms,但它发送消息之前不应该有一些默认值吗?@IndraneelBende,
queue.buffering.max.ms
默认值是5000msYes,只要确保在kafkaTemplate上调用send方法后程序不会立即退出(只需延迟一下),消费者能够收到信息。应该记住它是异步的!谢谢你的意见@英德拉尼尔本德,不客气。如果此答案有用,请接受。请尝试在您的生产者工厂配置中将
ProducerConfig.MAX\u IN\u FLIGHT\u REQUESTS\u PER\u CONNECTION
设置为
1