我有以下代码从Chronicle队列中读取(它是用Kotlin编写的,但这没关系):
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))
}
}
}
如何修改注释代码以从队列中读取前10条记录并继续?
原理:在队列用于显示日志的情况下,它非常有用。您希望查看一些以前的日志记录语句,并查看新的日志记录语句。
答案 0 :(得分:1)
我为你写了一个测试。请运行它应该工作。
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");
}
}
答案 1 :(得分:0)
除了直接使用索引外,您还可以使用ExcerptTailer
:
final SingleChronicleQueue queue = createQueue();
final int totalRecords = 20;
final int tailRecords = 10;
final ExcerptAppender appender = queue.acquireAppender();
for (int i = 0; i < totalRecords; i++) {
try(final DocumentContext ctx = appender.writingDocument()) {
ctx.wire().writeText(Integer.toString(i));
}
}
final ExcerptTailer tailer = queue.createTailer();
tailer.direction(TailerDirection.BACKWARD).toEnd();
int rewind = tailRecords;
final int endCycle = tailer.cycle();
while(--rewind != 0) {
try(final DocumentContext ctx = tailer.readingDocument()) {
if (!ctx.isPresent()) {
break;
}
if (endCycle != tailer.cycle()) {
System.out.println("Rewound past beginning of cycle");
}
}
}
tailer.direction(TailerDirection.FORWARD);
for (int i = 0; i < tailRecords; i++) {
try(final DocumentContext ctx = tailer.readingDocument()) {
if (!ctx.isPresent()) {
break;
}
System.out.println(ctx.wire().readText());
}
}