Hazelcast Ringbuffer readManyAsync返回空结果

时间:2015-10-13 18:43:12

标签: java hazelcast

我正在尝试使用readManyAsync从RingBuffer中读取N个项目,但它总是返回一个空的resultSet。如果我使用readOne,我会得到数据。

我正在使用readManyAsync作为文档指定。还有另一种方法吗?

环境:

  • Java 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

2 个答案:

答案 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可以做到这一点。

相关问题