Apache flink 关于Flink中状态的TTL配置
假设我有描述符的此配置,并从这里执行操作:Apache flink 关于Flink中状态的TTL配置,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,假设我有描述符的此配置,并从这里执行操作: ValueStateDescriptor<Event> descriptor = ...; StateTtlConfig ttlConfigOneHourAndReturnExpire = StateTtlConfig.newBuilder(Time.hours(1)) .setUpdateType(StateTtlConfig.UpdateType.OnReadAndWrite) .set
ValueStateDescriptor<Event> descriptor = ...;
StateTtlConfig ttlConfigOneHourAndReturnExpire = StateTtlConfig.newBuilder(Time.hours(1))
.setUpdateType(StateTtlConfig.UpdateType.OnReadAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.ReturnExpiredIfNotCleanedUp).build();
descriptor.enableTimeToLive(ttlConfigOneHourAndReturnExpire);
/*after one hour when the state is expired*/
Event e = state.value(); (step 1 and 2)
e.count = e.count + 1; (step 3)
value.update(e); (step 4)
ValueStateDescriptor=。。。;
StateTtlConfig ttlConfigOneHourAndReturnExpire=StateTtlConfig.newBuilder(Time.hours(1))
.setUpdateType(StateTtlConfig.UpdateType.OnReadAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.ReturnExpiredIfNotCleanedUp).build();
descriptor.enableTimeToLive(ttlConfigOneHourAndReturnExpire);
/*一小时后,当状态过期时*/
事件e=state.value();(步骤1和2)
e、 计数=e.计数+1;(步骤3)
更新(e);(步骤4)
这是否意味着在1小时后,当该状态已被弃用时,事情将按以下顺序发生:
亲切的问候 如果您需要每小时操纵一次状态,则创建一个自定义的
ProcessFunction
,并使用计时器触发该操作。使用ProcessFunction
,我是否需要声明窗口1小时,以便每小时使用onTimer
方法,然后在不丢失实际状态的情况下清除状态并重新更新值?如果是这样的话,我就不能这样做,因为用例需要尽可能快地触发,而不是每小时触发一次。我使用onTimer
对吗?如果我这样做的话,似乎不需要使用KeyedProcessFunction
来声明窗口
时间:long cleanupTime=getEndOfDay()-event.timestamp.getTime();ctx.timerService().registereventtimeter(cleanupTime)
当方法getEndOfDay
以长格式给我一天中的最后一个时间时,我是否能够在一天结束时清洁我的钥匙?我不理解你的要求。你说过“我想在每小时后清理一次状态”,但在最新的代码片段中,听起来你只是想在每天结束时清理一下。是的,很抱歉让你感到困惑,我需要在一天结束时清理所有状态,然后开始一个完全没有状态的新一天。我用上面的片段做对了吗?亲切的问候!