关于Flink中状态的TTL配置

问题描述

让我们假设我具有描述符的这种配置,并且操作是从此处进行的:

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. 除已弃用的状态外,返回记录的先前状态。
  2. 读取后将清除记录的先前状态。
  3. 在传递并清除了先前的状态(以读取状态)后更新对象。
  4. 在这种情况下更新状态将意味着再次创建状态,因为先前的状态已被删除,并且此值将再花费一个小时,否则此时将清除状态,而不是在点1处,并且对象不会包括更新,它将在到达时存储在状态中?

希望我能解释一下自己,因为文档不清晰。

从我需要在发生日变化时清理状态的角度开始,并且无法使用TTL进行此操作,我想每隔一小时清理一次状态,但是要在删除之前获取状态,更新当前值,然后再创建一个小时,但在丢失之前始终保持先前的状态。

希望这是有道理的,并且可以以某种方式做到。 亲切的问候!

解决方法

如果您需要每小时操纵一次状态,请创建一个自定义ProcessFunction并使用计时器来触发该操作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...