2

我正在使用 SingleChronicleQueue 实现来跟踪我从数据队列(也是 SingleChronicleQueue)中处理的最后一个元素。

为了从崩溃中恢复,我需要读取状态队列中的最后一个元素,这将为我提供最后处理的数据元素的索引。这很好用,但我对找到最后一个状态元素的方式不满意。

我现在做的是使用队列的 firstCycle() 和 lastCycle() 方法。然后我必须回去测试这些方法给出的循环范围内是否有任何元素,因为 lastCycle() 方法将返回一个与磁盘上可能存在或不存在的循环文件相对应的数字。(取决于应用程序关闭了多长时间)

一旦找到第一个周期(带有数据),我就会读取所有元素,直到我到达终点。这给了我处理最后一个数据索引的最后一个状态元素。

有没有更优雅的方式来获取最后一个状态元素。我已经尝试过 ExcerptTailer.toEnd() 但它在(丢失)循环文件的情况下不起作用..

4

1 回答 1

4

我想出了我遇到的问题,所以我想我会分享它。

为了读取状态队列中的最后一个元素,您可以使用

ExcerptTailer tailer = queue.createTailer(); tailer.direction(TailerDirection.BACKWARD).toEnd();

但是,你必须小心不要打电话

queue.acquireAppender().pretouch();

在您这样做之前,因为该pretouch()方法将创建可能需要创建的任何循环文件。完成后,调用

tailer.direction(TailerDirection.BACKWARD).toEnd();

会将您置于无法读取的位置。

TimeProvider注意:这仅在以使编年史队列滚动到新循环文件的方式设置时才会发生。

于 2017-03-05T13:06:03.877 回答