2017-03-04 36 views
0

我使用SingleChronicleQueue實現來跟蹤從數據隊列(也是SingleChronicleQueue)處理的最後一個元素。讀取編寫在Chronicle隊列中的最後一個元素

爲了從崩潰中恢復,我需要讀取狀態隊列中的最後一個元素,它會給我上一次處理的數據元素的索引。這工作得很好,但我不滿意我找到最後一個狀態元素的方式。

我現在所做的是使用隊列的firstCycle()和lastCycle()方法。然後我必須回頭測試這些方法給出的循環範圍內是否有元素,因爲lastCycle()方法將返回與循環文件相對應的數字,該循環文件可能存在或不存在於磁盤上。 (取決於應用程序停機的時間長短)

一旦找到第一個週期(包含數據),我將讀取所有元素,直到達到最後。這給了我最後一個處理最後一個數據索引的狀態元素。

有沒有更優雅的方式來獲取最後的狀態元素。我試過了ExcerptTailer.toEnd(),但它在(缺少)循環文件的情況下不起作用。

回答

2

我想到了我遇到的問題,所以我想我會分享它。

爲了讀取在狀態隊列中的最後一個元素可以使用

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

但是你必須要小心,不要打電話給

queue.acquireAppender()pretouch()。

之前,因爲pretouch()方法將創建任何可能需要創建的循環文件。之後完成調用

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

會將您置於無法讀取的位置。

注意:只有在設置了TimeProvider時纔會使記錄隊列轉到新的循環文件。

相關問題