这里有两个解决方案。它们在基本行为上或多或少是等价的,但是您可能会发现其中一个更容易理解、维护或 test。
至于你的问题,不,没有办法循环(重新排队)未消费的事件,不把他们推回到运动。但只要坚持到需要的时候就可以了。
解决方案1:使用RichFlatMapFunction
当T-type事件到达时,将它们附加到ListState对象。当J型事件到达时,将列表中所有匹配的T型事件收集到输出,并更新列表以仅保留那些将属于以后J型事件的T型事件。
解决方案2:使用带有自定义触发器和逐出器的GlobalWindows
除了已经完成的操作之外,实现一个逐出器(在窗口被触发之后)只从窗口中删除J-type事件和所有匹配的T-type事件。
更新:清除失效密钥/失效传感器的状态
在解决方案1中,您可以使用state TTL来安排清除与死 key相关联的任何非活动状态。或者可以使用KeyedProcessFunction而不是RichFlatMapFunction,并使用计时器来完成相同的任务。
使用windowapi管理过时 key的状态可能不那么简单,但是对于解决方案2,我相信您可以扩展自定义触发器,以包含一个将清除窗口的超时。如果你需要在全局窗口中使用状态和状态的话,你需要依赖全局进程状态。