throw new IllegalArgumentException("You must pass the queue written to, not the queue read"); @NotNull ExcerptTailer tailer = queue.createTailer() .direction(BACKWARD) .toEnd();
private static long countEntries(final ChronicleQueue queue) { final ExcerptTailer tailer = queue.createTailer(); tailer.toStart().direction(TailerDirection.FORWARD); long entryCount = 0L; while (true) { try (final DocumentContext ctx = tailer.readingDocument()) { if (!ctx.isPresent()) { break; } entryCount++; } } return entryCount; }
tailer.direction(TailerDirection.BACKWARD);
@Test public void uninitialisedTailerCreatedBeforeFirstAppendWithDirectionNoneShouldNotFindDocument() { final AtomicLong clock = new AtomicLong(System.currentTimeMillis()); String path = OS.TARGET + "/" + getClass().getSimpleName() + "-" + System.nanoTime(); final ChronicleQueue queue = SingleChronicleQueueBuilder.single(path).timeProvider(clock::get).testBlockSize() .rollCycle(RollCycles.TEST_SECONDLY).build(); final ExcerptTailer tailer = queue.createTailer(); tailer.direction(TailerDirection.NONE); final ExcerptAppender excerptAppender = queue.acquireAppender(); for (int i = 0; i < 10; i++) { excerptAppender.writeDocument(i, (out, value) -> { out.int32(value); }); } DocumentContext document = tailer.readingDocument(); assertFalse(document.isPresent()); }
.direction(TailerDirection.BACKWARD) .toEnd();
@Test public void shouldAccessMessageHistoryWhenTailerIsMovedToEnd() throws Exception { try (final ChronicleQueue inputQueue = createQueue(inputQueueDir, 1); final ChronicleQueue outputQueue = createQueue(outputQueueDir, 2)) { generateTestData(inputQueue, outputQueue); final ExcerptTailer tailer = outputQueue.createTailer(); tailer.direction(TailerDirection.BACKWARD).toEnd(); final ValidatingSecond validatingSecond = new ValidatingSecond(); final MethodReader validator = tailer.methodReader(validatingSecond); assertThat(validator.readOne(), is(true)); assertThat(validatingSecond.messageHistoryPresent(), is(true)); } }
@Test public void shouldReadBackwardFromEndOfQueueWhenDirectionIsSetAfterMoveToEnd() { try (final ChronicleQueue queue = builder(getTmpDir(), this.wireType) .rollCycle(TEST2_DAILY) .build()) { final ExcerptAppender appender = queue.acquireAppender(); appender.writeDocument(w -> w.writeEventName("hello").text("world")); final ExcerptTailer tailer = queue.createTailer(); tailer.toEnd(); tailer.direction(TailerDirection.BACKWARD); assertThat(tailer.readingDocument().isPresent(), is(true)); } }
void readForward(@NotNull ChronicleQueue chronicle, int entries) { ExcerptTailer forwardTailer = chronicle.createTailer() .direction(TailerDirection.FORWARD) .toStart(); for (int i = 0; i < entries; i++) { try (DocumentContext documentContext = forwardTailer.readingDocument()) { Assert.assertTrue(documentContext.isPresent()); Assert.assertEquals(i, RollCycles.DAILY.toSequenceNumber(documentContext.index())); StringBuilder sb = Wires.acquireStringBuilder(); ValueIn valueIn = documentContext.wire().readEventName(sb); Assert.assertTrue("hello".contentEquals(sb)); String actual = valueIn.text(); Assert.assertEquals("world" + i, actual); } } try (DocumentContext documentContext = forwardTailer.readingDocument()) { Assert.assertFalse(documentContext.isPresent()); } }
final RollCycle rollCycle = readQueue.rollCycle(); assertThat(rollCycle.toSequenceNumber(tailer.index()), is(0L)); try (final DocumentContext ctx = tailer.direction(TailerDirection.NONE).readingDocument()) { tailer.direction(TailerDirection.FORWARD).readingDocument()) { ValueIn valueIn = dc.wire().getValueIn(); value = (String) valueIn.object(); tailer.direction(TailerDirection.NONE).readingDocument()) { ValueIn valueIn = dc.wire().getValueIn(); value = (String) valueIn.object(); tailer.direction(TailerDirection.NONE).readingDocument()) { ValueIn valueIn = dc.wire().getValueIn(); value = (String) valueIn.object();
void readBackward(@NotNull ChronicleQueue chronicle, int entries) { ExcerptTailer backwardTailer = chronicle.createTailer() .direction(TailerDirection.BACKWARD) .toEnd(); for (int i = entries - 1; i >= 0; i--) { try (DocumentContext documentContext = backwardTailer.readingDocument()) { assertTrue(documentContext.isPresent()); final long index = documentContext.index(); assertEquals("index: " + index, i, (int) index); Assert.assertEquals(i, RollCycles.DAILY.toSequenceNumber(index)); Assert.assertTrue(documentContext.isPresent()); StringBuilder sb = Wires.acquireStringBuilder(); ValueIn valueIn = documentContext.wire().readEventName(sb); Assert.assertTrue("hello".contentEquals(sb)); String actual = valueIn.text(); Assert.assertEquals("world" + i, actual); } } try (DocumentContext documentContext = backwardTailer.readingDocument()) { assertFalse(documentContext.isPresent()); } }
private void test(final int pause) { SetTimeProvider timeProvider = new SetTimeProvider(); timeProvider.currentTimeMillis(System.currentTimeMillis()); File tmpDir = getTmpDir(); SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(tmpDir).timeProvider(timeProvider).rollCycle(RollCycles.TEST_SECONDLY).build(); ExcerptAppender excerptAppender = queue.acquireAppender(); try (DocumentContext dc = excerptAppender.writingDocument()) { dc.wire().write("hello").text("world"); } timeProvider.advanceMillis(pause); { ExcerptTailer tailer = queue.createTailer().direction(TailerDirection.BACKWARD); tailer.toEnd(); try (DocumentContext dc = tailer.readingDocument()) { assertEquals("world", dc.wire().read("hello").text()); } } // pretouch to create next cycle file ----- IF YOU COMMENT THIS LINE THE TEST PASSES excerptAppender.pretouch(); { ExcerptTailer tailer = queue.createTailer().direction(TailerDirection.BACKWARD); tailer.toEnd(); try (DocumentContext dc = tailer.readingDocument()) { assertTrue(dc.isPresent()); assertEquals("world", dc.wire().read("hello").text()); } } }
@Test public void testReadingWritingWhenCycleIsSkippedBackwards() throws Exception { final File dir = DirectoryUtils.tempDir(testName.getMethodName()); final RollCycles rollCycle = RollCycles.TEST_SECONDLY; // write first message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).build()) { queue.acquireAppender().writeText("first message"); } //TODO: this test fails when converted to use a TimeProvider. Need to work out why Thread.sleep(2100); // write second message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).build()) { queue.acquireAppender().writeText("second message"); } // read both messages try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).build()) { ExcerptTailer tailer = queue.createTailer(); ExcerptTailer excerptTailer = tailer.direction(TailerDirection.BACKWARD).toEnd(); Assert.assertEquals("second message", excerptTailer.readText()); Assert.assertEquals("first message", excerptTailer.readText()); } }
tailer = tailer.direction(TailerDirection.FORWARD); Assert.assertEquals(0, action(tailer, queue.rollCycle())); Assert.assertEquals(1, action(tailer, queue.rollCycle())); tailer = tailer.direction(TailerDirection.BACKWARD); Assert.assertEquals(2, action(tailer, queue.rollCycle())); Assert.assertEquals(1, action(tailer, queue.rollCycle())); tailer = tailer.direction(TailerDirection.FORWARD); Assert.assertEquals(0, action(tailer, queue.rollCycle())); Assert.assertEquals(1, action(tailer, queue.rollCycle()));
private long toIndexFromEnd(long countFromEnd) { long fromSequenceNumber = -1; if (countFromEnd > 0) { @Nullable final SingleChronicleQueue chronicleQueue = (SingleChronicleQueue) queueView.underlying(); @NotNull final ExcerptTailer excerptTailer = chronicleQueue.createTailer().direction(BACKWARD).toEnd(); fromSequenceNumber = excerptTailer.index(); if (fromSequenceNumber == 0) return 0; for (int i = 0; i < countFromEnd; i++) { try (DocumentContext documentContext = excerptTailer.readingDocument()) { if (!documentContext.isPresent()) break; fromSequenceNumber = documentContext.index(); } } } return fromSequenceNumber; }
throw new IllegalArgumentException("You must pass the queue written to, not the queue read"); @NotNull ExcerptTailer tailer = queue.createTailer() .direction(BACKWARD) .toEnd();