Ежедневные архивы хроник

Я пытаюсь внедрить Chronicle Queue в нашу систему, и у меня возник вопрос относительно ежедневной прокрутки файлов, но в определенное время в соответствии с местным часовым поясом процесса. Я прочитал несколько статей о том, как указать цикл вращения, но, согласно документации, время эпохи соответствует полуночи UTC. Что мне нужно сделать, чтобы настроить цикл прокрутки, скажем, каждый день в 17:00 по местному часовому поясу запущенного процесса? Какие-либо предложения?

public class TestRollCycle {

    public class TestClass implements TestEvent {
        private int counter = 1;

        @Override
        public void setOrGetEvent(String event) {
            System.out.println("Counter Read Value: " + counter);
            counter++;
        }
    }

    public interface TestEvent {
        void setOrGetEvent(String event);
    }

    @Test
    public void testRollProducer() {
        int insertCount = 1;
        String pathOfFile = "rollPath";
        // Epoch is 5:15PM EDT
        SingleChronicleQueue producerQueue = SingleChronicleQueueBuilder.binary(pathOfFile).epoch(32940000).build();
        ExcerptAppender myAppender = producerQueue.acquireAppender();
        TestEvent eventWriter = myAppender.methodWriter(TestEvent.class);

        while (true) {
            String testString = "Insert String";
            eventWriter.setOrGetEvent(testString);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Counter Write Value: " + insertCount);
            insertCount++;
        }
    }

    @Test
    public void testRollConsumer() throws InterruptedException {
        String pathOfFile = "rollPath";
        // Epoch is 5:15PM EDT
        SingleChronicleQueue producerQueue = SingleChronicleQueueBuilder.binary(pathOfFile).epoch(32940000).build();
        TestClass myClass = new TestClass();
        ExcerptTailer trailer = producerQueue.createTailer();
        MethodReader methodReader = trailer.methodReader(myClass);

        while (true) {
            if (!methodReader.readOne()) {
                Thread.sleep(1000);
            } else {
                //System.out.println(trailer.index());
            }
        }
    }
}

person ATO    schedule 28.08.2017    source источник


Ответы (2)


Это функция, которую мы добавили в Chronicle Queue Enterprise. Я предлагаю вам связаться с [email protected], если вы готовы заплатить за это.

person Peter Lawrey    schedule 29.08.2017
comment
ааа.. спасибо за ответ. Придется уточнять и проверять. Хотя другой связанный с этим вопрос позволяет сказать, что я использую функцию рулона по умолчанию, которая составляет полночь UTC, так каково положение дел в момент переключения? Я имею в виду, если постоянный поток сообщений ожидает сохранения в течение этого времени, есть ли вероятность потери сообщений или все идет гладко? - person ATO; 29.08.2017
comment
Вы можете указать epoch в построителе как фиксированное время суток, но не часовой пояс с переходом на летнее время. Нам не известно ни о какой ситуации, когда вы могли бы потерять написанное или пропустить сообщение. - person Peter Lawrey; 29.08.2017
comment
Петр - Я сделал следующее. Потому что эталоном для рулона является полночь UTC, и я хочу, чтобы рулон произошел в 17:00 по восточному поясному времени, что означает 21:00 по всемирному координированному времени. Итак, в эпоху я указал 32400000 миллисекунд (== 9 часов). Я начал свой образец в 15:30 по восточному поясному времени. Я ожидал, что в 17:00 по восточному поясному времени роль должна произойти в новый день, но этого не произошло. Ожидается ли это? В документации указано иное. - person ATO; 31.08.2017
comment
@ATO, можете ли вы включить автономный тест, который показывает это? - person Peter Lawrey; 01.09.2017
comment
Питер - я отредактировал свой вопрос и добавил пример кода. Просто чтобы дать вам немного больше цвета. Прокрутка файлов работает, но в некоторых условиях. Я тестировал несколько раз за последние пару дней ближе к полуночи по восточному поясному времени, и тест работал нормально. Если я поставлю время перемотки в 1:00 утра по восточному поясному времени (5:00 UTC), произойдет переключение. Но если я добавлю 17:00 по восточноевропейскому времени (9:00 по Гринвичу), переключатель не работает. Один и тот же код выше двух разных результатов. - person ATO; 06.09.2017

Я думаю, что в вашем тесте есть проблема - эпоха 32940000, предоставленная построителю очереди, составляет 9 часов 15 минут от полуночи, поэтому 9:15 утра по всемирному координированному времени или 5:15 утра по восточному поясному времени. Должно пройти еще 12 часов, чтобы время переноса было 17:15.

Я добавил тест, который документирует текущее поведение для вашего варианта использования, и он прошел, как и ожидалось. Можете ли вы перепроверить, что вы указываете правильное смещение эпохи, и, возможно, реализовать StoreFileListener для захвата/регистрации любых событий прокрутки.

Прокрутка фактически не произойдет, пока событие не будет записано в очередь, которая находится после границы времени прокрутки. Таким образом, незанятая очередь, в которую не выполняется запись, не будет выполняться без входных событий.

Тест есть на гитхабе:

https://github.com/OpenHFT/Chronicle-Queue/blob/master/src/test/java/net/openhft/chronicle/queue/impl/single/QueueEpochTest.java

person Mark Price    schedule 06.09.2017
comment
Ааа... Я понял проблему... 9 против 21... Спасибо... Что касается добавленного вами тестового кода, кажется, что метод rollTime, который заменяет эпоху, не является частью последней версии v4.5.27. Это БЕТА API или платная версия? Также класс DirectoryUtils. - person ATO; 06.09.2017
comment
Спасибо, Марк. Является ли master правильной веткой для извлечения? Или Тег - хроника-очередь-4.6.15? - person ATO; 07.09.2017
comment
Вы должны использовать теги выпуска для стабильных версий. Ветка master активно развивается. - person Mark Price; 11.09.2017
comment
Спасибо, Марк. Последний вопрос. В примере производитель выполняет setCurrentTime, чтобы заставить очередь использовать время, которое мы устанавливаем. Если на другом конце есть одновременный считыватель, должен ли считыватель также выполнять setCurrentTime, чтобы и читатель, и писатель работали с одним и тем же cq4? У меня есть такая ситуация, когда производителю и потребителю, использующим Chronicle, не нужно выключаться, а ежедневно в установленное время прокручивать. Мне не нужно вызывать setCurrentTime после каждого рулона. - person ATO; 12.09.2017
comment
В примере задается текущее время только для того, чтобы получить поведение броска в модульном тесте. Вы не должны переопределять TimeProvider, если для этого нет очень веской причины. Читатель не должен заботиться о «времени», он просто читает события с конца очереди. - person Mark Price; 12.09.2017