Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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 卡夫卡:如何消费、操作、确认(手动)并将结果发送到新主题_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java 卡夫卡:如何消费、操作、确认(手动)并将结果发送到新主题

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

我目前正在使用卡夫卡流库。

我正在尝试做的事情:(/strong>)我正在尝试从主题中消费,操纵消息值,确认该消息并将结果传输到另一个主题(下面的代码)

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)设置为
false
——您甚至不能将其设置为
true
。Cf:有很多关于卡夫卡流的文档:,etc@wardziniak那么,对于给定的条件,如何重定向到不同的生产者?假设“record”(在上面的代码中)为空或包含单词“blue”;我们如何将这些条件发送给不同的制作人?如果您使用卡夫卡流,则不会直接使用卡夫卡制作人。我如何理解您的用例,您想要向不同主题发送消息取决于一些谓词,因为您可以使用
KStream::to(final-topicnametractor-topicExtractor,final-producted)
properties.put(“enable.auto.commit”,false)设置为
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)