0

重庆: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 线程与他们自己的 tailer)?一开始我注册了一些感兴趣的读者,一旦我收到相同数量的发布信号,我将文件标记为删除。但我已经看到 onAcquired 和 onReleased 在 Reader 的同一个文件上多次出现。

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

我可以使用同一个 ChronicleReader 进行多次读取吗?如果我在同一个编年史中有多个阅读器,我将获得多少个发布事件?是否也有可能一个文件被阅读器释放,但作家仍然在同一个文件上写?

4

1 回答 1

0

一个文件可能会被多次获取/发布。

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

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

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

于 2018-01-08T12:58:19.180 回答