Triggers 我们可以在Flink';什么是触发器?

Triggers 我们可以在Flink';什么是触发器?,triggers,state,apache-flink,flink-streaming,sliding-window,Triggers,State,Apache Flink,Flink Streaming,Sliding Window,我正在使用ApacheFlink的带触发器的滑动窗口。我想在触发器中使用状态变量。但是,我没有找到任何与触发函数对应的rich函数 inputStream.keyBy(new KeySelector<Integer, String>() { @Override public String getKey(Integer i) throws Exception { return i;

我正在使用ApacheFlink的带触发器的滑动窗口。我想在触发器中使用状态变量。但是,我没有找到任何与触发函数对应的rich函数

inputStream.keyBy(new KeySelector<Integer, String>() {
            @Override
            public String getKey(Integer i) throws Exception {
                return i;
            }
        }).window(SlidingEventTimeWindows.of(Time.seconds(windowSize), Time.seconds(slideStep)))
            .trigger(new Trigger<String, TimeWindow> {
    

    @Override
    public TriggerResult onElement(String str, long l, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {            
            return TriggerResult.CONTINUE; 
    }

    @Override
    public TriggerResult onProcessingTime(long l, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
        return TriggerResult.FIRE;
    }

    @Override
    public TriggerResult onEventTime(long l, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
        return TriggerResult.FIRE;
    }

    @Override
    public void clear(TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {

    })
            .apply(new RichWindowFunction<String, String, String, TimeWindow>() {...}
inputStream.keyBy(新的KeySelector(){
@凌驾
公共字符串getKey(整数i)引发异常{
返回i;
}
}).window(SlidingEventTimeWindows.of(Time.seconds(windowSize),Time.seconds(slideStep)))
.触发器(新触发器){
@凌驾
public TriggerResult OneElement(字符串str,long l,TimeWindow TimeWindow,TriggerContext TriggerContext)引发异常{
返回TriggerResult.CONTINUE;
}
@凌驾
public TriggerResult on ProcessingTime(长l、时间窗口时间窗口、TriggerContext TriggerContext)引发异常{
返回TriggerResult.FIRE;
}
@凌驾
public TriggerResult onEventTime(长l、时间窗口时间窗口、TriggerContext TriggerContext)引发异常{
返回TriggerResult.FIRE;
}
@凌驾
公共无效清除(TimeWindow TimeWindow、TriggerContext TriggerContext)引发异常{
})
.apply(新的RichWindowFunction(){…}

所以我的问题是,我们可以在触发器块中使用状态变量吗?

是的,触发器可以是有状态的。请看一个例子。您将看到,它会记录有多少元素被添加到窗口中

private final reduceingstatedescriptor stateDesc=
新的ReductionStateDescriptor(“count”,new Sum(),LongSerializer.INSTANCE);
然后,它在其
onElement
方法中使用该状态

public TriggerResult OneElement(对象元素,长时间戳,W窗口,TriggerContext ctx)
抛出异常{
reduceingState计数=ctx.getPartitionedState(stateDesc);
计数。添加(1L);
if(count.get()>=maxCount){
count.clear();
返回TriggerResult.FIRE;
}
返回TriggerResult.CONTINUE;
}
并在其
clear
方法中清除它

public void clear(W窗口,TriggerContext ctx)引发异常{
getPartitionedState(stateDesc.clear();
}

请记住,如果要实现可合并的窗口类型,那么触发器将必须使用可合并的状态,然后在合并窗口时将其合并。(因为您使用的是滑动窗口的某些风格,所以可能可以忽略这一点。)

我发现当窗口滑动时,状态被重置。我希望在窗口滑动之间保留键控状态值。是否可能?我还尝试删除“ctx.getPartitionedState(stateDesc).clear();”使用clear方法,但不起作用。我使用的是ValueState。从一个窗口到另一个窗口可以保留的唯一状态是
ProcessWindowFunction.Context\globalState