2015-10-13 13 views
5

Sto provando a leggere N elementi da un RingBuffer utilizzando readManyAsync ma restituisce sempre un risultato risultato vuoto. Se uso readOne ottengo dati.Hazelcast Ringbuffer readManyAsync restituisce risultati vuoti

Sto usando readManyAsync come specificato dalla documentazione. C'è un altro modo per farlo?

Ambiente:

  • Java 8
  • Hazelcast 3.5.3

Esempio:

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)); 
} 

uscita:

*** readManyAsync *** readCount: 0 
*** readOne *** 
0 - a 
1 - b 
2 - c 

risposta

5

Sei felice con ricezione zero risultati:

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

Prova cambiando 0 a 1.

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

Ora la chiamata verrà bloccata finché non ci sarà almeno 1 risultato.

Probabilmente puoi rendere le cose più efficienti richiedendo più di 3 articoli. Nella maggior parte dei casi, il recupero dei dati è economico, ma la pianificazione di io/operazione è costosa. Quindi prova a raggruppare il più possibile. Quindi cerca di ottenere il maggior numero possibile di risultati. Ad es. 100 ... o 1000 (che è il massimo).

1

Ok, ma come si usa readManyAsync in modo non bloccante, con minCount su 0?

Ho fatto un test minimale e non riesco davvero a capirlo. Ho pubblicato un argomento di supporto qui:

https://groups.google.com/forum/#!topic/hazelcast/FGnLWDGrzb8

Come risposta: Io uso readManyAsync con un timeout, in questo modo:

try{ 
    buffer.readManyAsync(sequence, 1, 3, null).get(500, TimeUnit.MILLISECONDS); 
} catch (TimeoutException e){ 
    // We timed out, shame, let's move on 
} 

Questo sembra l'unico modo per fare un thread non-blocking grazioso , ma leggendo il documento, pensavo davvero che un minCount = 0 avrebbe funzionato.

+1

Beh, in realtà è un bug: https: //groups.google.com/forum/#! Topic/hazelcast/FGnLWDGrzb8 – Brice

+0

Grazie per aver segnalato il problema. Sono state effettuate le PR per master e manutenzione: https://github.com/hazelcast/hazelcast/pull/6788 – pveentjer

Problemi correlati