我创建了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进行多次读取吗?如果我在同一个编年史上有多个读者,我将获得多少个发布活动? 是否有可能读者发布文件,但作者仍然在同一个文件上写?
答案 0 :(得分:0)
可以多次获取/释放文件。
ExcerptTailers不能安全地在多个线程之间共享。
如果您希望实现安全的文件删除机制,最好在每个阅读器线程中跟踪ExcerptTailer.cycle()。当所有读者的尾部循环前进到N + 1时,应该可以安全地删除与循环N相对应的文件。您可以通过调用以下文件检索文件:
queue.storeForCycle(N, 0, false).file();