2015-10-13 12 views
5

मैं ReadManyAsync का उपयोग करके एक रिंगबफर से एन आइटम पढ़ने की कोशिश कर रहा हूं लेकिन यह हमेशा खाली परिणाम देता है। अगर मैं readOne का उपयोग करता हूं तो मुझे डेटा मिलता है।Hazelcast Ringbuffer readManyAsync रिक्त परिणाम

मैं प्रलेखन निर्दिष्ट के रूप में readManyAsync का उपयोग कर रहा हूं। ऐसा करने का एक और तरीका है?

पर्यावरण:

  • जावा 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, नल);

को 1.

buffer.readManyAsync (अनुक्रम, 1, 3, नल) 0 बदलने का प्रयास करें;

अब कॉल कम से कम 1 परिणाम होने तक अवरुद्ध हो जाएगा।

शायद आप 3 से अधिक वस्तुओं के लिए पूछकर चीजों को और अधिक कुशल बना सकते हैं। ज्यादातर मामलों में, डेटा पुनर्प्राप्त करना सस्ता है, लेकिन आईओ/ऑपरेशन शेड्यूलिंग महंगा है। तो जितना संभव हो बैच करने की कोशिश करें। तो जितना संभव हो उतने परिणाम प्राप्त करने का प्रयास करें .. उदा। 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/#! विषय/हेज़ेलकास्ट/FGnLWDGrzb8 – Brice

+0

समस्या को इंगित करने के लिए धन्यवाद। मास्टर और रखरखाव के लिए पीआर है: https://github.com/hazelcast/hazelcast/pull/6788 – pveentjer

संबंधित मुद्दे