我正在查看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。这感觉有点草率,但在实践中不太可能出错。