2

我正在尝试将 Chronicle Queue 实施到我们的系统中,并且有一个关于每天滚动文件的问题,但在特定时间根据进程的本地时区。我读了几篇关于如何指定滚动周期的文章,但根据文档,纪元时间按照午夜 UTC 工作。假设每天下午 5 点本地时区运行的进程,我需要做什么来配置滚动周期?有什么建议么?

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());
            }
        }
    }
}
4

2 回答 2

1

这是我们添加到 Chronicle Queue Enterprise 的功能。如果您愿意为此付费,我建议您联系 sales@chronicle.software。

于 2017-08-29T04:04:01.177 回答
1

我认为您的测试存在问题 - 提供给队列构建器的 32940000 纪元是从午夜开始的 9 小时 15 分,因此是世界标准时间上午 9:15 或美国东部时间上午 5:15。滚动时间应该再过 12 个小时才能到下午 5:15。

我添加了一个测试,记录了您的用例的当前行为,并且它按预期通过了。您能否仔细检查您是否提供了正确的纪元偏移量,并可能实施 aStoreFileListener以捕获/记录任何滚动事件。

在滚动时间边界之后的事件被写入队列之前,滚动实际上不会发生。因此,未写入的空闲队列将不会在没有输入事件的情况下滚动。

测试在github上:

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

于 2017-09-06T08:18:27.233 回答