我正在研究一个用例,其中我必须从afro格式的流中读取来自kafka主题的消息,并将其转换为字符串,然后将其存储到AWS S3存储桶中。
@Configuration
public class MessagePromotion {
@Autowired
private AmazonS3 s3client;
@Value("${aws.s3.bucket}")
private String awsS3Bucket;
@Autowired
@Bean
public KStream<String, testEvent> kstreamPromotionUppercase(StreamsBuilder builder) {
KStream<String, testEvent> sourceStream = builder.stream("test-topic");
//sourceStream.print(Printed.<String, testEvent>toSysOut().withLabel("Original Stream"));
sourceStream.mapValues(testEvent -> new ObjectMapper().writeValueAsString(testEvent));
s3client.putObject(awsS3Bucket, "test3", sourceStream.toString() );
return sourceStream;
}}
我能够在Avro中读取消息,但无法将其转换为字符串/ json。我在这里做错了
sourceStream.mapValues(testEvent -> new ObjectMapper().writeValueAsString(testEvent));
答案 0 :(得分:0)
sourceStream.mapValues()
的结果是一个KStream
,它是数据流的逻辑抽象-它不是像Java Map
或List
这样的真正“容器”等等,因此,调用KStream.toString()
类似于调用Object.toString()
...实际上并没有任何作用。
如果要遍历所有消息,请致电foreach()
KStream<String, String> converted = sourceStream.mapValues(...);
converted.foreach((k, v) -> s3client.putObject(awsS3Bucket, "test3", v));
不过,还请注意,StreamsBuilder
仅声明一个数据流(即,它建立了一个计划,但不执行任何操作)。要真正开始计算,您需要创建KafakStreams
客户,将Topology
和StreamBuilder#build()
客户的start()
传入。
我强烈建议您检查文档,阅读介绍和快速入门,以更好地了解Kafka Streams的工作原理:https://kafka.apache.org/documentation/streams/