我目前在时间窗口的Flink应用程序上运行可查询状态,该应用程序根据是否在最后一分钟看到了一个事务而返回true或false . 我似乎不能在Windowed State上使用可查询状态,只能在Global State上使用它 .

当我使用全局状态时,我能够很好地访问我的布尔值Value,但是我想使用窗口状态,因为存储在状态中的值应该在一定时间后过期 .

Process Function Code:

if(!valueStateDescriptor.isQueryable())
        valueStateDescriptor.setQueryable("query");

    exists = context.globalState().getState(valueStateDescriptor);

    for (Data data: iterable) {
        exists.update(true);
        System.out.println(exists.value());
        collector.collect(data);
    }

当我使用我的查询客户端时,当我将 context.globalState() 切换到 context.windowState() 时,我得到了 .

java.lang.RuntimeException:无法查询查询的状态后端2.引起:java.io.IOException:无法反序列化键和命名空间 . 这表示KvState实例和此访问使用的键/命名空间序列化程序不匹配 .

我试图修改现有的状态我实现了我的窗口的“清除”触发器,但它没有修改我的可查询客户端的结果 .

@Override
    public void clear(TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
        System.out.println("clear");
        triggerContext.getPartitionedState(valueStateDescriptor).update(false);
    }

有没有办法利用窗口触发器使窗口状态失效? (我相信窗口状态将为我处理这个问题)我可以使用窗口状态而不是全局状态用于可查询状态吗?