Hazelcast Ringbuffer readManyAsync返回空结果
问题描述:
我试图读取使用readManyAsync从RingBuffer N项,但它总是返回一个空结果。如果我使用readOne,我会得到数据。Hazelcast Ringbuffer readManyAsync返回空结果
我正在使用readManyAsync作为文档指定。还有另一种方法可以做到这一点?
环境:
- 爪哇8
- Hazelcast 3.5.3
实施例:
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
答
您对获得零结果感到满意:
buffer.readManyAsync(sequence,0,3,null);
尝试改变0到1
buffer.readManyAsync(序列,1,3,NULL);
现在调用将阻塞,直到至少有1条结果。
也许你可以通过询问超过3项事情更有效率。在大多数情况下,检索数据很便宜,但io /操作安排很昂贵。所以尽可能地尝试批量处理。所以尽量获得尽可能多的结果。 100 ...或1000(这是最大值)。
答
好吧,但你如何在非阻塞的方式使用readManyAsync,与minCount为0?
我做了一个最小的测试案例,我真的无法弄清楚。我发布了支持主题在这里:
https://groups.google.com/forum/#!topic/hazelcast/FGnLWDGrzb8
作为一个答案:我用readManyAsync以超时,像这样:
try{
buffer.readManyAsync(sequence, 1, 3, null).get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e){
// We timed out, shame, let's move on
}
这似乎让优美的无阻塞线程的唯一途径,但通过阅读文档,我真的认为minCount = 0会做到这一点。
那么它实际上是一个错误:HTTPS://groups.google.com/forum/#话题/ hazelcast/FGnLWDGrzb8 – Brice
感谢您指出的问题。 PR的主人和维护已经取得: https://github.com/hazelcast/hazelcast/pull/6788 – pveentjer