我想在一段时间后或在处理了1000件物品之后,部分收集Kafka Streams中列表中的项目。
KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> kStream = builder.stream(topicTwo);
KTable<String, String> kTable = builder.table(topicOne);
kStream.join(kTable,
(streamValue, tableValue) -> new CustomObject(streamValue, tableValue)
.foreach((key, value) -> System.out.println(value));
KafkaStreams streams = new KafkaStreams(builder, streamProperties);
streams.start();
Runtime.getRuntime().addShutdownHook(new Thread(streams::close));
这是我的代码。我不知道自己是否足够清楚,但我想要的是每1000件物品处理或5秒钟后List<CustomObject>
。这可能吗?
答案 0 :(得分:1)
为此,我认为您需要定义自定义Transformer。
在其transform方法中,将消息附加到列表中。如果列表大小达到1000个元素,则创建一个新列表并返回旧列表。
在其init方法schedule上,在ProcessorContext上有一个标点符号函数,它会发出比您的时间窗更早的元素列表。
在连接后使用KStream上的transform方法将自定义转换器添加到拓扑中。
在变换器中,最好将缓冲元素保留在StateStore中,而不是保留在内存列表中,以确保故障转移/重新平衡时不会丢失任何消息。 StateStores在Kafka备份。