Java 需要Spring Kafka KafkaTemplate.flush()吗?
我是第一次使用SpringKafka,我使用SpringKafka创建了一个生产者和消费者。我让kafka服务器在本地主机上运行,并创建了一个名为test的主题。我无法通过简单的呼叫向消费者发送消息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方法 来自官方的
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
。