我正在尝试使用readManyAsync从RingBuffer中读取N个项目,但它总是返回一个空的resultSet。如果我使用readOne,我会得到数据。
我正在使用readManyAsync作为文档指定。还有另一种方法吗?
环境:
示例:
Ringbuffer<String> buffer = this.hazelcastInstance.getRingbuffer("testBuffer");
buffer.add("a");
buffer.add("b");
buffer.add("c");
Long sequence = buffer.headSequence();
ICompletableFuture<ReadResultSet<String>> resultSetFuture = buffer.readManyAsync(sequence, 0, 3, null);
ReadResultSet<String> resultSet = resultSetFuture.get();
System.out.println("*** readManyAsync *** readCount: " + resultSet.readCount());
int count = 0;
for (String s : resultSet) {
System.out.println(count + " - " + s);
count++;
}
System.out.println("*** readOne ***");
for (int i = 0; i < 3; i++) {
System.out.println(i + " - " + buffer.readOne(i));
}
输出:
*** readManyAsync *** readCount: 0
*** readOne ***
0 - a
1 - b
2 - c
答案 0 :(得分:5)
您对收到零结果很满意:
buffer.readManyAsync(sequence,0,3,null);
尝试将0更改为1.
buffer.readManyAsync(sequence,1,3,null);
现在呼叫将阻止,直到至少有1个结果。
通过要求超过3个项目,您可以提高效率。在大多数情况下,检索数据很便宜,但是io /操作调度很昂贵。所以尽可能多地尝试批量。因此,尽量获得尽可能多的结果。 100 ...或1000(这是最大值)。
答案 1 :(得分:1)
好的,但是如何以非阻塞方式使用readManyAsync,minCount为0?
我制作了一个最小的测试用例,我真的无法弄明白。我在这里发布了一个支持主题:
https://groups.google.com/forum/#!topic/hazelcast/FGnLWDGrzb8
作为答案:我使用readManyAsync超时,如下所示:
{{1}}
这似乎是制作一个优雅的非阻塞线程的唯一方法,但是通过阅读文档,我真的认为minCount = 0可以做到这一点。