我们的管道缓冲事件,并每500个事件进行一次外部提取(用于充实)。当计时器触发时,计时器触发时,将处理这些事件。当然,当您有503个事件,将有3个未丰富的事件。
从实验中我们了解到@FinishBundle
总是在计时器之前被调用。甚至看来,捆绑包的结果在计时器执行之前已已提交(检查点?)。如果我们可以从@FinishBundle访问状态并对这些最后的事件进行充实,则它们将成为已提交捆绑包的一部分。
我相信这将解决我们的恰好一次问题:目前,计时器也需要提取并在重新执行时再次执行。当我们可以在@FinishBundle
中调整状态时,就不再需要获取,并且当计时器重新执行时,将从状态开始。
显然,无法通过@FinishBundle
函数访问状态,因为以下内容会导致错误:
@FinishBundle
public void finishBundle(FinishBundleContext c,
@StateId("buffer") BagState<AwesomeEvent> bufferState) {
LOG.info("--- FINISHBUNDLE CALLED ---");
// TODO: ENRICHMENT
LOG.info("--- FINISHBUNDLE DONE ---");
}
我做错什么了吗,还是有另一种方法可以从该功能访问状态?
此外,我是否对计时器行为进行了正确的评估?