使用kafka流在时间窗口中获取给定键的最后事件

时间:2019-02-13 10:17:59

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

我开始使用KStream消耗现有主题中的数据。

我只想在10秒的时间内获取给定ID的最后一个事件。我尝试使用以下代码:

StreamsBuilder builder = new StreamsBuilder();
KStream<String, MySale> stream = builder.stream(INPUT_TOPIC, Consumed.with(Serdes.String(), specificAvroSerde));

stream.selectKey((key, value) -> value.getID())
    .groupByKey()
    .windowedBy(TimeWindows.of(Duration.ofSeconds(10)))
    .reduce((value1, value2) -> value2)
    .toStream()
    .peek((key, value) -> log.info("key={}, value={}", key, value.toString()))
    .to(OUTPUT_TOPIC, Produced.with(Serdes.String(), specificAvroSerde));

但是我最终得到了所有事件,而不仅仅是最后一个。可以使用KStream做我想做的事吗?

1 个答案:

答案 0 :(得分:2)

使用.suppress()

它会抑制窗口中的所有中间结果,并且仅发出最终结果。

stream.selectKey((key, value) -> value.getID())
    .groupByKey()
    .windowedBy(TimeWindows.of(Duration.ofSeconds(10)))
    .reduce((value1, value2) -> value2)
    .suppress(Suppressed.untilWindowCloses(unbounded())))  // like this
    .toStream()
    .peek((key, value) -> log.info("key={}, value={}", key, value.toString()))
    .to(OUTPUT_TOPIC, Produced.with(Serdes.String(), specificAvroSerde));

您可以在此处了解更多信息:https://kafka.apache.org/21/documentation/streams/developer-guide/dsl-api.html#window-final-results