Очередь хроники - readDocument (). IsPresent () возвращает значение false при наличии значений - PullRequest
0 голосов
/ 22 октября 2019

Я изменил основной код здесь [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'

1 Ответ

0 голосов
/ 22 октября 2019

попробуйте использовать его с блоком try-with-resources, например:

try (DocumentContext context = tailer.readingDocument()) {
 if (context.isPresent()) {
  // do something
 }
 int myIndex = context.index
}

, например

try (final DocumentContext dc = appender.writingDocument()) {
    dc.wire().write().text(“your text data“);
    System.out.println("your data was store to index="+ dc.index());
}

и

try (DocumentContext context = tailer.readingDocument()) {
   String youText = context.wire().read().text();
}
...