Очередь хроники - когда срабатывает 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();

Другие вопросы по тегам