- 决定何时触发窗口后续的逻辑执行。每个窗口都有一个默认的触发器,时间窗口默认watermark超过EndTime就触发计算
| 窗口类型 | 触发器 | 触发时机 |
|---|---|---|
| EventTime(Tumblng/Sliding/Session) | EventTimeTrigger | 一旦Watermark没过窗口的EndTime,该窗口触发 |
| ProcessingTime(Tumblng/Sliding/Session) | ProcessingTimeTrigger | 一旦系统时间没过窗口的EndTime,该窗口触发 |
| GlobalWindow | NeverTrigger | 永不触发 |
- Flink中定义了Trigger抽象类,任何trigger必须继承Trigger类,Flink官方提供了几种常用的trigger实现,同时,用户可以根据需求自定义trigger。
public abstract class Triggerimplements Serializable { private static final long serialVersionUID = -4104633972991191369L; public abstract TriggerResult onElement(T element, long timestamp, W window, TriggerContext ctx) throws Exception; public abstract TriggerResult onProcessingTime(long time, W window, TriggerContext ctx) throws Exception; public abstract TriggerResult onEventTime(long time, W window, TriggerContext ctx) throws Exception; public boolean canMerge() { return false; } public void onMerge(W window, OnMergeContext ctx) throws Exception { throw new UnsupportedOperationException("This trigger does not support merging."); } public abstract void clear(W window, TriggerContext ctx) throws Exception; }
- 前三方法决定着如何通过返回一个TriggerResult枚举类来操作输入事件
5. ProcessingTimeTrigger 源码分析CONTINUE:什么都不做
FIRE:触发计算
PURE:清除窗口的元素
FIRE_AND_PURE:触发计算和清除窗口元素
public class ProcessingTimeTrigger extends Trigger
- 需要注意的是ProcessingTimeTrigger类只会在窗口的最终时间到达的时候触发窗口函数的计算,计算完成后并不会清除窗口中的数据,这些数据存储在内存中,除非调用PURGE或FIRE_AND_PURGE,否则数据将一直存在内存中。实际上,Flink中提供的Trigger类,除了PurgingTrigger类,其他的都不会对窗口中的数据进行清除。



