我正在使用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");
答案 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(…)
(取决于您的使用案例)。