Chronicle Queue - StoreListener何时触发

时间:2017-12-13 17:56:33

标签: chronicle-queue

CQ:4.5.27。

我创建了2个用于写入(单线程)和其他读取器(N个线程)的编年史,使用单个chronicleReader读取相同的文件。

SingleChronicleQueue chronicleWriter = chronicleFactory.createChronicle("Writer", path, RollCycles.MINUTELY);

SingleChronicleQueue chronicleReader  = chronicleFactory.createChronicle("Reader", path, RollCycles.MINUTELY);


public class ChronicleFactory {

ChronicleProcessorImpl chronicleProcessor = new ChronicleProcessorImpl();
public SingleChronicleQueue createChronicle(String instance, String persistenceDir, RollCycles rollCycles) {
    SingleChronicleQueue chronicle = null;
    try {
        chronicle = SingleChronicleQueueBuilder.binary(persistenceDir).rollCycle(rollCycles).storeFileListener(new StoreFileListener() {
            @Override
            public void onReleased(int i, File file) {
                System.out.println(Thread.currentThread().getName() + " onReleased called for file: " + file.getAbsolutePath());
                //chronicleProcessor.onRead(file);
            }
            @Override
            public void onAcquired(int cycle, File file) {
                System.out.println( Thread.currentThread().getName() +  " onAcquired called for file: " + file.getAbsolutePath());
            }
        }).build();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return chronicle;
}

}

为Reader调用StoreFileListener onRelease的次数和次数(带有自己的尾部的N个线程)? 一开始我正在注册感兴趣的读者数量,一旦我收到相同数量的发布信号,我标记文件删除。 但我已经看到onAcquired和onReleased在同一个文件上多次出现在Reader上。

我对onReleased的理解应该只在完全读取编年史文件时发生一次。

我可以使用相同的chronicleReader进行多次读取吗?如果我在同一个编年史上有多个读者,我将获得多少个发布活动? 是否有可能读者发布文件,但作者仍然在同一个文件上写?

1 个答案:

答案 0 :(得分:0)

可以多次获取/释放文件。

ExcerptTailers不能安全地在多个线程之间共享。

如果您希望实现安全的文件删除机制,最好在每个阅读器线程中跟踪ExcerptTailer.cycle()。当所有读者的尾部循环前进到N + 1时,应该可以安全地删除与循环N相对应的文件。您可以通过调用以下文件检索文件:

queue.storeForCycle(N, 0, false).file();