Flink中的ProcessingTimeoutTrigger如何与可以在处理时间触发的嵌套触发器一起工作



我正在查看ProcessingTimeoutTrigger的源代码,该代码假设包装任何触发器添加超时触发器功能。我想知道它将如何与nestedTrigger一起工作,例如,它自己的处理时间计时器。根据实施情况:

@Override
public TriggerResult onProcessingTime(long timestamp, W window, TriggerContext ctx) throws Exception {
TriggerResult triggerResult = this.nestedTrigger.onProcessingTime(timestamp, window, ctx);
if (shouldClearOnTimeout) {
this.clear(window, ctx);
}
return triggerResult.isPurge() ? TriggerResult.FIRE_AND_PURGE : TriggerResult.FIRE;
}

无论nestedTrigger调用结果如何,它都将触发WindowFunction。我想知道为什么?如果此计时器已向nestedTrigger注册,并且出现在向ProcessingTimeoutTrigger注册的计时器之前,我们为什么要开火?

同样的问题也适用于onEventTime实现ProcessingTimeoutTrigger不注册任何eventTime计时器。这意味着onEventTime将被调用,用于在nestedTrigger中注册的计时器。为什么在这种情况下,我们总是开火?

难道我们不应该以某种方式检查当前触发的计时器是否真的是ProcessingTimeoutTrigger注册的计时器吗?我在这里错过了什么?

我以前没有注意到ProcessingTimeoutTrigger的存在,所以这只是我基于阅读代码和测试以及FLINK-17058(添加此功能的票证(的看法。

testWindowPurgingWhenInerTriggerIsPurging测试了我担心的嵌套ProcessingTimeTrigger的情况,即测试在清除嵌套触发器时是否清除包装超时触发器。这样,如果嵌套触发器在外部触发器之前触发并被清除,则外部触发器将被清除。如果内部触发器在没有清除的情况下启动,那么外部触发器应该保持原位。

在我看来,onEventTime假设如果嵌套触发器注册了一个事件时间计时器,那么当该计时器触发时,窗口应该FIRE。这感觉有点草率,但在实践中不太可能出错。

相关内容

  • 没有找到相关文章

最新更新