2015-10-13 3 views
5

Я пытаюсь прочитать N элементов из RingBuffer с помощью readManyAsync, но он всегда возвращает пустой набор результатов. Если я использую readOne, я получаю данные.Hazelcast Ringbuffer readManyAsync возвращает пустые результаты

Я использую readManyAsync, как указано в документации. Есть ли другой способ сделать это?

Enviroment:

  • 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 

ответ

5

Вы счастливы с получением нулевого результата:

buffer.readManyAsync (последовательность, 0, 3, нуль);

Попробуйте изменить от 0 до 1.

buffer.readManyAsync (последовательности, 1, 3, NULL);

Теперь звонок будет заблокирован до достижения хотя бы 1 результата.

Возможно, вы можете сделать вещи более эффективными, запросив более 3 предметов. В большинстве случаев получение данных дешево, но планирование io/operation дорого. Поэтому постарайтесь как можно добежать. Поэтому постарайтесь получить как можно больше результатов. 100 ... или 1000 (что является максимальным).

1

Хорошо, но как вы используете 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/#! Topic/hazelcast/FGnLWDGrzb8 – Brice

+0

Спасибо, что указали эту проблему. PR для основного и технического обслуживания были сделаны: https://github.com/hazelcast/hazelcast/pull/6788 – pveentjer

Смежные вопросы