问题描述
让我们假设我具有描述符的这种配置,并且操作是从此处进行的:
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)
这意味着在过时1小时后,状态将按以下顺序发生:
- 除已弃用的状态外,返回记录的先前状态。
- 读取后将清除记录的先前状态。
- 在传递并清除了先前的状态(以读取状态)后更新对象。
- 在这种情况下更新状态将意味着再次创建状态,因为先前的状态已被删除,并且此值将再花费一个小时,否则此时将清除状态,而不是在点1处,并且对象不会包括更新,它将在到达时存储在状态中?
希望我能解释一下自己,因为文档不清晰。
从我需要在发生日变化时清理状态的角度开始,并且无法使用TTL进行此操作,我想每隔一小时清理一次状态,但是要在删除之前获取状态,更新当前值,然后再创建一个小时,但在丢失之前始终保持先前的状态。
希望这是有道理的,并且可以以某种方式做到。 亲切的问候!
解决方法
如果您需要每小时操纵一次状态,请创建一个自定义ProcessFunction
并使用计时器来触发该操作。