Kafka生产者配置立即发送消息

时间:2015-07-09 08:24:31

标签: java apache-kafka

我正在使用Kafka生产者0.8.2并且我正在尝试向该主题发送单个消息,其方式是立即发送消息。我有一个控制台消费者来观察消息是否到达。我注意到消息没有立即发送,除非我在发送后立即运行producer.close(),这不是我想做的事情。

针对此目标的正确生产者配置设置是什么?我使用以下内容(我意识到它看起来像是一堆不同的配置/版本,但我根本无法找到正如我在文档中所期望的那样工作):

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokersStr);
props.put(ProducerConfig.RETRIES_CONFIG, "3");
props.put("producer.type", "sync");
props.put("batch.num.messages", "1");
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "none");
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 1);
props.put(ProducerConfig.BLOCK_ON_BUFFER_FULL_CONFIG, true);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

2 个答案:

答案 0 :(得分:0)

我找到了一个似乎合理的解决方案,并且涉及在Producer的send()命令返回的Future上运行get()。我改变了发送命令:

producer.send(record);

以下内容:

producer.send(record).get();

如果对这种方法有任何问题,那么听听更有经验的Kafka用户会很高兴吗?此外,我有兴趣了解是否有生产者的配置设置来实现相同的事情(即,在不运行Future的get()的情况下立即发送单个消息)。

答案 1 :(得分:-1)

老帖子,但我在这里错过了很多错过的帖子。

我偶然发现了尝试运行Kafka示例的相同行为,而<ToggleButton Content="Switch" Name="chk"/> <Rectangle Fill="Red" Name="rect" Width="50" Height="50"> <Rectangle.Style> <Style TargetType="Rectangle"> <Style.Triggers> <DataTrigger Binding="{Binding IsChecked, ElementName=chk}" Value="False"> <DataTrigger.EnterActions> <BeginStoryboard> <Storyboard Storyboard.TargetProperty="Opacity"> <DoubleAnimation From="1" To="0"/> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> <DataTrigger.ExitActions> <BeginStoryboard> <Storyboard Storyboard.TargetProperty="Opacity"> <DoubleAnimation From="0" To="1"/> </Storyboard> </BeginStoryboard> </DataTrigger.ExitActions> </DataTrigger> </Style.Triggers> </Style> </Rectangle.Style> </Rectangle> 是唯一将消息传递给Kafka的内容。 The Javadoc for KafkaProducer.send(…)表示此方法是异步的。在我的测试代码中,消息被发送到Kafka,而我的代码继续运行,实际上只是到达运行结束并在消息实际发送到.get()之前终止。

所以这个Future只会在.get()上阻止,直到它被实现为止。这实际上消除了Future的好处。更简洁的方法是在Future之后立即等待Thread.sleep(…)(取决于您的使用案例)。