gpt4 book ai didi

java - 历史记录队列 - readDocument().isPresent() 在值存在时返回 false

转载 作者:行者123 更新时间:2023-12-02 01:16:17 27 4
gpt4 key购买 nike

我在这里修改了基本代码[github] https://github.com/OpenHFT/Chronicle-Queue/blob/master/docs/How_it_works.adoc

基本上,我正在拍摄编年史队列中的一些相同的可编码对象。我添加了一些打印语句来显示正在发生的情况。


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());

}
}

输出

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...

如果队列中有对象,那么为什么readingDocument().isPresent()返回false?另外为什么对象返回 null?

编辑 - 版本实现“net.openhft:chronicle-queue:5.17.25”

最佳答案

我用 tryWithResources 重写了你的示例并且它有效。代码中的问题是每次调用 tailer.readingDocument().isPresent() 实际上是将指针移动到最后读取的条目。

static class MyObject extends SelfDescribingMarshallable {
String name;
int age;
}

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
try (final DocumentContext dc = appender.writingDocument()) {
me.writeMarshallable(dc.wire());
}
try (final DocumentContext dc = appender.writingDocument()) {
me.writeMarshallable(dc.wire());
}
try (final DocumentContext dc = appender.writingDocument()) {
me.writeMarshallable(dc.wire());
}
try (final DocumentContext dc = appender.writingDocument()) {
me.writeMarshallable(dc.wire());
}
try (final DocumentContext dc = tailer.readingDocument()) {
System.out.println("2. Tailer is Present = " + dc.isPresent() + ", Tailer Current Index = " + dc.index() + ", End = " + queue.createTailer().toEnd().index());
if (dc.isPresent()) {
MyObject result = new MyObject();
result.readMarshallable(dc.wire());
System.err.println(result);
}
}

try (final DocumentContext dc = tailer.readingDocument()) {
System.out.println("3. Tailer is Present = " + dc.isPresent() + ", Tailer Current Index = " + dc.index() + ", End = " + queue.createTailer().toEnd().index());
if (dc.isPresent()) {
MyObject result = new MyObject();
result.readMarshallable(dc.wire());
System.err.println(result);
}
}

try (final DocumentContext dc = tailer.readingDocument()) {
System.out.println("4. Tailer is Present = " + dc.isPresent() + ", Tailer Current Index = " + dc.index() + ", End = " + queue.createTailer().toEnd().index());
}



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());

}

关于java - 历史记录队列 - readDocument().isPresent() 在值存在时返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58495896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com