Очередь хроники - когда срабатывает StoreListener
CQ: 4.5.27.
Я создал 2 хроники для одной для записи (один поток) и другой читатель (N потоков), читающий один и тот же файл с использованием одного хронического чтения.
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;
}
}
Когда и сколько раз StoreFileListener onRelease вызывается для Reader (N потока с собственным тейлером)? Вначале я регистрирую количество заинтересованных читателей и как только получаю равное количество сигналов выпуска, я отмечаю файл для удаления. Но я видел, что onAcquired и onReleased встречаются несколько раз в одном и том же файле для Reader.
То, что я понял на Released, должно произойти только один раз, когда файл хроники прочитан полностью.
Могу ли я использовать один и тот же летоик для многократного чтения? И сколько событий релизов я получу, если у меня будет несколько читателей в одной хронике? Возможно ли, что файл выпущен читателем, но писатель все еще пишет в тот же файл?
1 ответ
Возможно, файл будет получен / выпущен несколько раз.
ExcerptTailers нельзя безопасно разделить между несколькими потоками.
Если вы хотите внедрить механизм безопасного удаления файлов, вам лучше отслеживать ExcerptTailer.cycle() в каждом потоке чтения. Когда цикл чтения всех читателей переходит на N+1, тогда будет безопасно удалить файл, соответствующий циклу N. Вы можете извлечь файл для цикла, вызвав:
queue.storeForCycle(N, 0, false).file();