Java 卡夫卡:如何消费、操作、确认(手动)并将结果发送到新主题
我目前正在使用卡夫卡流库。 我正在尝试做的事情:(/strong>)我正在尝试从主题中消费,操纵消息值,确认该消息并将结果传输到另一个主题(下面的代码)Java 卡夫卡:如何消费、操作、确认(手动)并将结果发送到新主题,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我目前正在使用卡夫卡流库。 我正在尝试做的事情:(/strong>)我正在尝试从主题中消费,操纵消息值,确认该消息并将结果传输到另一个主题(下面的代码) Properties属性=新属性(); . . properties.put(“enable.auto.commit”,false); StreamBuilder=新的StreamBuilder(); KStream KStream=builder.stream(“MyTopic”); KafkaStream KafkaStream=新的Kaf
Properties属性=新属性();
.
.
properties.put(“enable.auto.commit”,false);
StreamBuilder=新的StreamBuilder();
KStream KStream=builder.stream(“MyTopic”);
KafkaStream KafkaStream=新的KafkaStream(builder.build(),properties)
卡夫卡制作人=新卡夫卡制作人(属性);
kStream.forEach(新的ForeachAction(){
@凌驾
公共无效应用(字符串参数、字符串值){
//只是做一些简单的数据操作
字符串myValue=值+新日期().toString();
//将结果发送到新主题
producer.send(新ProducerRecord(“MyTopicWithTimeStamp”,myValue)):
//问题(1)此处->如何从此处手动确认
//问题(2)我应该如何正确处理/关闭我的制作人(如果有)
}
});
kafkaStram.start();
我不知道怎么做:使用kafka streams库正确确认消息您可以使用KStream直接写入kafka输出主题,而不是创建和维护您自己的producer实例,如下所示:
final Properties props = new Properties();
...
final StreamsBuilder builder = new StreamsBuilder();
final KStream<String, String> source = builder.stream("MyTopic");
source.mapValues(record -> record + new Date().toString()).to("MyTopicWithTimeStamp",
Produced.with(Serdes.String(), Serdes.String()));
...
final KafkaStreams streams = new KafkaStreams(builder.build(), props);
streams.start();
final Properties=new Properties();
...
最终StreamsBuilder生成器=新StreamsBuilder();
最终KStream source=builder.stream(“MyTopic”);
source.mapValues(记录->记录+新日期().toString()).to(“MyTopicWithTimeStamp”,
生成的.with(Serdes.String(),Serdes.String());
...
最终KafkaStreams streams=新的KafkaStreams(builder.build(),props);
streams.start();
您可以使用KStream直接写入Kafka输出主题,而不是创建和维护自己的producer实例,如下所示:
final Properties props = new Properties();
...
final StreamsBuilder builder = new StreamsBuilder();
final KStream<String, String> source = builder.stream("MyTopic");
source.mapValues(record -> record + new Date().toString()).to("MyTopicWithTimeStamp",
Produced.with(Serdes.String(), Serdes.String()));
...
final KafkaStreams streams = new KafkaStreams(builder.build(), props);
streams.start();
final Properties=new Properties();
...
最终StreamsBuilder生成器=新StreamsBuilder();
最终KStream source=builder.stream(“MyTopic”);
source.mapValues(记录->记录+新日期().toString()).to(“MyTopicWithTimeStamp”,
生成的.with(Serdes.String(),Serdes.String());
...
最终KafkaStreams streams=新的KafkaStreams(builder.build(),props);
streams.start();
您也可以按照@amethystic的建议,直接通过kafka stream API编写,而不是使用手动方法
source.mapValues(record -> record + new Date().toString()).to("MyTopicWithTimeStamp",
Produced.with(Serdes.String(), Serdes.String()));
关于acknowlegdement,您可以在流配置中设置属性,以确保生产者在发布到主题时收到确认
final Properties props = new Properties();
props .put(StreamsConfig.producerPrefix(ProducerConfig.ACKS_CONFIG), "all");
您可以参考流配置:
您可以直接通过kafka stream API编写,而不是使用手动方法,正如@amethystic所建议的那样
source.mapValues(record -> record + new Date().toString()).to("MyTopicWithTimeStamp",
Produced.with(Serdes.String(), Serdes.String()));
关于acknowlegdement,您可以在流配置中设置属性,以确保生产者在发布到主题时收到确认
final Properties props = new Properties();
props .put(StreamsConfig.producerPrefix(ProducerConfig.ACKS_CONFIG), "all");
您可以参考流配置:
有很多关于卡夫卡流的文档:,etc@wardziniak那么,对于给定的条件,如何重定向到不同的生产者?假设“record”(在上面的代码中)为空或包含单词“blue”;我们如何将这些条件发送给不同的制作人?如果您使用卡夫卡流,则不会直接使用卡夫卡制作人。我如何理解您的用例,您想要向不同主题发送消息取决于一些谓词,因为您可以使用
KStream::to(final-topicnametractor-topicExtractor,final-producted)
properties.put(“enable.auto.commit”,false)默认情况下,code>设置为false
——您甚至不能将其设置为true
。Cf:有很多关于卡夫卡流的文档:,etc@wardziniak那么,对于给定的条件,如何重定向到不同的生产者?假设“record”(在上面的代码中)为空或包含单词“blue”;我们如何将这些条件发送给不同的制作人?如果您使用卡夫卡流,则不会直接使用卡夫卡制作人。我如何理解您的用例,您想要向不同主题发送消息取决于一些谓词,因为您可以使用KStream::to(final-topicnametractor-topicExtractor,final-producted)
properties.put(“enable.auto.commit”,false)默认情况下,code>设置为false
——您甚至不能将其设置为true
。Cf:给定上述解决方案;如果记录为空,如何将其发送到不同的主题?我不明白你说的记录为空是什么意思。您是否说记录的键或值为空?如果值变为空,请将记录传输到其他主题,因为映射逻辑为value+new Date()。toString()
,然后,空有效负载的记录将被传输到字符串,如nullThu Jan 31 09:12:20 CST 2019
,Kafka将此字符串作为新记录发送到输出主题。您可以使用to(TopicNameExtractor)
而不是to(string)
,该字符串接受一个固定的输出主题名称,给出上述解决方案;如果记录为空,如何将其发送到不同的主题?我不明白你说的记录为空是什么意思。您是否说记录的键或值为空?如果值变为空,请将记录传输到其他主题,因为映射逻辑为value+new Date()。toString()
,然后,空有效负载的记录将被传输到字符串,如nullThu Jan 31 09:12:20 CST 2019
,卡夫卡将此字符串作为新记录发送到输出主题。您可以使用to(TopicNameExtractor)
而不是采用一个固定输出主题名称的to(string)