Я изменил основной код здесь [github] https://github.com/OpenHFT/Chronicle-Queue/blob/master/docs/How_it_works.adoc
По сути, я снимаю хроническую очередь некоторых из тех же самых объектов Marshallable-ized. Я включил несколько операторов печати, чтобы показать, что происходит.
import java.io.IOException;
import java.nio.file.Files;
import net.openhft.chronicle.queue.ExcerptAppender;
import net.openhft.chronicle.queue.ExcerptTailer;
import net.openhft.chronicle.queue.impl.single.SingleChronicleQueue;
import net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder;
import net.openhft.chronicle.wire.Marshallable;
public class App {
static class MyObject implements Marshallable {
String name;
int age;
@Override
public String toString() {
//return "";
return Marshallable.$toString(this);
}
}
public static void main(String[] args) throws IOException {
// will write the .cq4 file to working directory
SingleChronicleQueue queue = SingleChronicleQueueBuilder.builder().path(Files
.createTempDirectory("queue").toFile()).build();
ExcerptAppender appender = queue.acquireAppender();
ExcerptTailer tailer = queue.createTailer();
MyObject me = new MyObject();
me.name = "rob";
me.age = 40;
System.out.println("1. Tailer is Present = " + tailer.readingDocument().isPresent() + ", Tailer Current Index = " + tailer.index() + ", End = " + queue.createTailer().toEnd().index());
// write 'MyObject' to the queue
appender.writeDocument(me);
appender.writeDocument(me);
appender.writeDocument(me);
appender.writeDocument(me);
System.out.println("2. Tailer is Present = " + tailer.readingDocument().isPresent() + ", Tailer Current Index = " + tailer.index() + ", End = " + queue.createTailer().toEnd().index());
// read 'MyObject' from the queue
MyObject result = new MyObject();
tailer.readDocument(result);
System.out.println("3. Tailer is Present = " + tailer.readingDocument().isPresent() + ", Tailer Current Index = " + tailer.index() + ", End = " + queue.createTailer().toEnd().index());
System.out.println(result);
try {
Thread.sleep(500);
} catch (Exception e){
System.out.println(e);
}
System.out.println("Tailer is Present = " + tailer.readingDocument().isPresent() + ", Tailer Current Index = " + tailer.index() + ", End = " + queue.createTailer().toEnd().index());
}
}
output
1. Tailer is Present = false, Tailer Current Index = 0, End = 0
2. Tailer is Present = true, Tailer Current Index = 78129750081536, End = 78129750081540
3. Tailer is Present = false, Tailer Current Index = 78129750081536, End = 78129750081540
!chron.App$MyObject {
name: !!null "",
age: 0
}
Tailer is Present = false, Tailer Current Index = 78129750081536, End = 78129750081540
Итак, из моего понимания ... Я создал один статический объект. Я подал его в хроническую очередь в общей сложности четыре раза, все они один и тот же объект. Вы можете видеть, что в хронической очереди всего четыре объекта. Конечный индекс - Начальный индекс.
Функция trailer.readingDocument (). IsPresent () может видеть только первый созданный объект. после этого он возвращает false ...
Если в очереди есть объекты, то почему readDocument (). isPresent () возвращает false? Также, почему объект возвращает ноль?
edit - реализация версии 'net.openhft :ronicle-queue: 5.17.25'