Search code examples
javachronicle-queue

How to read last N records from Chronicle Queue?


I have the following code to read from Chronicle queue (it's written in Kotlin but that does not matter):

val queue = ChronicleQueueBuilder.single(path).build()
val tailer = queue.createTailer()

tailer.toEnd()

// // This code is wrong
//    val lastIndex = tailer.index()
//
//    val shift = lastIndex - 10
//    if (shift > 0) {
//        tailer.moveToIndex(lastIndex)
//    }

while (true) {
    val text = await(tailer)

    if (prefix == null) {
        println(text)
    } else {
        if (text.startsWith(prefix)) {
            // Would be nice without additional allocation ...
            println(text.substring(prefix.length + 1))
        }
    }
}

How can I modify the commented code to read previous 10 records from the queue and continue on?

Rationale: It is useful in situations where the queue is used for displaying logs. You want to see a few previous logging statements and see new logging statements as they come.


Solution

  • I have written a test for you. Please run the same it should work.

    public class ChronicleTest {
    
    private String chroniclePath = "/tmp/chronicle-test";
    
    private int msgCount = 10;
    
    private int i = 0;
    
        @Test
        public void writeToQ() {
            ChronicleQueue queue = ChronicleQueueBuilder.single(chroniclePath).build();
            ExcerptAppender appender = queue.acquireAppender();
            for (i = 1; i <= msgCount; i++) {
                appender.writeBytes(b -> {
                    b.writeInt(i);
                });
            }
            ExcerptTailer tailer = queue.createTailer();
            tailer.toEnd();
            long lastIndex = tailer.index();
            tailer.moveToIndex(lastIndex - 5);
    
            while (tailer.readBytes(b -> {
                int value = b.readInt();
                System.out.println("Received:" + value);
            }))
                System.out.println("Completed");
        }
    }