我正在使用SingleChronicleQueue实现来跟踪我从数据队列(也是SingleChronicleQueue)处理的最后一个元素。
为了从崩溃中恢复,我需要读取状态队列中的最后一个元素,它将为我提供最后处理的数据元素的索引。这非常有效,但我对找到最后一个状态元素的方式不满意。
我现在所做的是使用队列的firstCycle()和lastCycle()方法。然后我必须回过头来测试这些方法给出的循环范围内是否有任何元素,因为lastCycle()方法将返回一个对应于循环文件的数字,该文件可能存在于磁盘上,也可能不存在。 (取决于应用程序停机的时间)
一旦找到第一个循环(带数据),我会读到所有元素,直到我到达终点。这给了我最后一个处理了最后一个数据索引的状态元素。
是否有更优雅的方式来获取最后一个状态元素。我已经尝试过ExcerptTailer.toEnd()但它在(缺少)循环文件的情况下不起作用..
答案 0 :(得分:2)
我想到了我遇到的问题所以我想我会分享它。
为了读取状态队列中的最后一个元素,您可以使用
ExcerptTailer tailer = queue.createTailer(); tailer.direction(TailerDirection.BACKWARD).toEnd();
但是你必须小心不要打电话
queue.acquireAppender()pretouch();
之前,因为pretouch()方法将创建可能需要创建的任何循环文件。之后调用
tailer.direction(TailerDirection.BACKWARD).toEnd();
会将您置于无法阅读的位置。
注意:只有在以使编年史队列翻转到新的循环文件的方式设置TimeProvider时才会发生这种情况。