Flink onTimer定時器

元亨利貞發表於2023-11-28

程式碼例項

public class OnTimerProcesFunction extends KeyedProcessFunction<String, JSONObject, JSONObject> {
    private ValueState<JSONObject> assetVinState;
    @Override
    public void open(Configuration parameters) throws Exception {
        assetVinState = getRuntimeContext().getState(new ValueStateDescriptor<>("asset-vin-state", JSONObject.class));
    }
    @Override
    public void processElement(JSONObject value, KeyedProcessFunction<String, JSONObject, JSONObject>.Context ctx, Collector<JSONObject> out) throws Exception {
        JSONObject data = assetVinState.value();
        if (data == null || data.isEmpty()) {
            out.collect(value);
            //將當前資料設定進狀態,並且註冊定時器
            assetVinState.update(value);
            // 定時器時間為60秒
            ctx.timerService().registerProcessingTimeTimer(ctx.timerService().currentProcessingTime() + 40000L);
        } else {
            // 注意:這裡更新的資料沒有註冊定時器,那麼不會觸發定時傳送功能;那這裡最新的更新資料,則需要在下面的onTimer中進行定時器的註冊,併傳送資料到下游
            assetVinState.update(value);
        }
    }
    @Override
    public void onTimer(long timestamp, KeyedProcessFunction<String, JSONObject, JSONObject>.OnTimerContext ctx, Collector<JSONObject> out) throws Exception {
        //提取狀態資料往下游傳送
        JSONObject data = assetVinState.value();
        if (data == null || data.isEmpty()) {
            return;
        }
        out.collect(data);
        // 定時器時間為60秒,這裡設定一個定時器,為了將狀態中vin對應的最新更新資料傳送一次到下游
        ctx.timerService().registerProcessingTimeTimer(ctx.timerService().currentProcessingTime() + 40000L);
    }
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024433/viewspace-2997548/,如需轉載,請註明出處,否則將追究法律責任。

相關文章