Apache flink 我们可以在Flink中同时计算和处理时间触发器吗?

Apache flink 我们可以在Flink中同时计算和处理时间触发器吗?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我想在计数达到100后或翻滚过程时间每5秒完成一次窗口?也就是说,当元素达到100时,触发Windows计算,但是如果元素没有达到100,但时间经过5秒,它也会触发Windows计算,就像下面两个触发器的组合一样: .countWindow(100) .window(TumblingProcessingTimeWindows.of(Time.seconds(5))使用当前的Flink API没有超简单的方法来实现这一点 您的用例需要状态(用于计数)和计时器的组合。您可以使用自定义的windows

我想在计数达到100后或翻滚过程时间每5秒完成一次窗口?也就是说,当元素达到100时,触发Windows计算,但是如果元素没有达到100,但时间经过5秒,它也会触发Windows计算,就像下面两个触发器的组合一样:

.countWindow(100)


.window(TumblingProcessingTimeWindows.of(Time.seconds(5))

使用当前的Flink API没有超简单的方法来实现这一点

您的用例需要状态(用于计数)和计时器的组合。您可以使用自定义的windows来实现这一点,也可以使用

对于使用windows和自定义触发器的方法,查看ProcessingTimeTrigger和CountTrigger的用法会很有帮助,因为您基本上希望将两者混合使用

ProcessFunction是一个较低级别的构建块,它将托管状态与计时器结合在一起,这正是您所需要的,因此这可能更容易,特别是如果您已经知道如何使用它


顺便说一句,其中包括学习如何使用ProcessFunctions的材料。

非常感谢您的帮助,我会检查您的材料,如果我有困难,我会在这里回答。我注意到您这里的示例与onTimer函数的官方示例不同,官方示例中有timestamp==result.lastModified+XXX),但是您的示例中没有XXX。我还可以问一下ctx.timestamp()的含义吗?来自何处,何时分配给ctx?从官方示例来看,ctx.timestamp()似乎每60秒更改一次,它是水印吗?在processElement中,ctx.timestamp是从当前正在处理的流元素中提取的时间戳。这可能会随着对processElement的每次调用而改变,也可能不会,这取决于流的外观。当前水印可从ctx.timerService().currentWatermark()获得。时间戳和水印来自时间戳提取器和水印生成器。谢谢,是的,幻灯片中有几个bug。我会修好的。