在监控中保存某个状态值,但是过一段时间后需要将该值清理掉,防止对业务有影响或者堆积浪费存储空间。
flink提供了状态超时设置。
实例如下:
class MyFilter extends RichFilterFunction[JSONObject]{ var dateState: ValueState[String] = _ val sdf: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd") override def open(parameters: Configuration): Unit = { val valueStateDesc = new ValueStateDescriptor[String]("date-state",classOf[String]) //设置状态的超时时间以及更新时间的策略 val stateTtlConfig = StateTtlConfig.newBuilder(Time.hours(24)).setUpdateType(UpdateType.OnCreateAndWrite).build() valueStateDesc.enableTimeToLive(stateTtlConfig) dateState = getRuntimeContext.getState(valueStateDesc) } override def filter(value: JSONObject): Boolean = { val lastPageId = value.getJSONObject("page").getString("last_page_id") //当上一个页面id为空时 if(null == lastPageId || lastPageId.length <= 0){ //取出状态数据 val lastDate = dateState.value() //取出今天的日期 val currDate = sdf.format(value.getString("ts")) //判断2个日期是否相同 if(!currDate.equals(lastDate)){ dateState.update(currDate) return true }else { return false } }else { false } } } }
这里
StateTtlConfig.newBuilder(Time.hours(24)) //设置状态保存24小时
.setUpdateType(UpdateType.OnCreateAndWrite) //设置在创建或者更新记录同时,更新超时时间。
.build()