Hazelcast Ringbuffer readManyAsync returns 空结果
Hazelcast Ringbuffer readManyAsync returns Empty Results
我正在尝试使用 readManyAsync 从 RingBuffer 中读取 N 个项目,但它总是 returns 一个空的结果集。如果我使用 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
您很高兴收到零结果:
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 可以解决问题。
我正在尝试使用 readManyAsync 从 RingBuffer 中读取 N 个项目,但它总是 returns 一个空的结果集。如果我使用 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
您很高兴收到零结果:
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 可以解决问题。