每日纪事卷文件

时间:2017-08-28 19:49:55

标签: chronicle chronicle-map chronicle-queue

我正在尝试将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());
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为您的测试存在问题 - 提供给队列构建器的32940000的时代是从午夜起9小时15分钟,因此UTC时间上午9:15或美国东部时间上午5:15。这应该是另一个12小时后滚动时间是下午5:15。

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

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

测试在github:

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