Kafka Streams收集列表中的流项目

时间:2018-04-26 07:18:20

标签: java list stream apache-kafka apache-kafka-streams

我想在一段时间后或在处理了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>。这可能吗?

1 个答案:

答案 0 :(得分:1)

为此,我认为您需要定义自定义Transformer

在其transform方法中,将消息附加到列表中。如果列表大小达到1000个元素,则创建一个新列表并返回旧列表。

在其init方法schedule上,在ProcessorContext上有一个标点符号函数,它会发出比您的时间窗更早的元素列表。

在连接后使用KStream上的transform方法将自定义转换器添加到拓扑中。

在变换器中,最好将缓冲元素保留在StateStore中,而不是保留在内存列表中,以确保故障转移/重新平衡时不会丢失任何消息。 StateStores在Kafka备份。