Hazelcast Ringbuffer readManyAsync returns 空结果

Hazelcast Ringbuffer readManyAsync returns Empty Results

我正在尝试使用 readManyAsync 从 RingBuffer 中读取 N 个项目,但它总是 returns 一个空的结果集。如果我使用 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

您很高兴收到零结果:

buffer.readManyAsync(sequence, 0, 3, null);

尝试将 0 更改为 1。

buffer.readManyAsync(sequence, 1, 3, null);

现在调用将阻塞,直到至少有 1 个结果。

也许你可以要求 3 个以上的项目来提高效率。在大多数情况下,检索数据很便宜,但 io/operation 调度很昂贵。所以尽量批量化。因此,请尝试获得尽可能多的结果......例如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 可以解决问题。