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会做到这一点。

+1

那么它实际上是一个错误:HTTPS://groups.google.com/forum/#话题/ hazelcast/FGnLWDGrzb8 – Brice

+0

感谢您指出的问题。 PR的主人和维护已经取得: https://github.com/hazelcast/hazelcast/pull/6788 – pveentjer