2012-11-26 7 views
10

Ich bin angefangen zu verwenden asynchbase Bibliothek von StumbleUpon und habe einige Probleme mit der fortlaufenden asynchronen Scans. Ich schrieb diesen Code, basierend auf meinem Verständnis von Bibliothek Prinzipien:scannt mit asynchbase

public class AsyncScanner 
    implements Callback<Object, ArrayList<ArrayList<KeyValue>>> { 
    private final Scanner scan; 

    public AsyncScanner(Scanner scan) { 
     this.scan = scan; 
    } 

    public void start() { 
     scan.nextRows().addCallback(this); 
    } 

    @Override 
    public Object call(ArrayList<ArrayList<KeyValue>> rows) throws Exception { 
     if (rows == null) { 
      return null; 
     } 
     // some useful things here 
     scan.nextRows().addCallback(this); 
     return null; 
    } 
} 

Aber mit diesem Code auf große Scans Ich habe Stackoverflow bekommt:

java.lang.StackOverflowError 
    at java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl.compareAndSet(AtomicIntegerFieldUpdater.java:279) 
    at com.stumbleupon.async.Deferred.casState(Deferred.java:580) 
    at com.stumbleupon.async.Deferred.access$100(Deferred.java:430) 
    at com.stumbleupon.async.Deferred$Continue.call(Deferred.java:1342) 
    at com.stumbleupon.async.Deferred.doCall(Deferred.java:1262) 
    at com.stumbleupon.async.Deferred.runCallbacks(Deferred.java:1241) 
    at com.stumbleupon.async.Deferred.access$300(Deferred.java:430) 
    at com.stumbleupon.async.Deferred$Continue.call(Deferred.java:1350) 
    at com.stumbleupon.async.Deferred.doCall(Deferred.java:1262) 
    at com.stumbleupon.async.Deferred.runCallbacks(Deferred.java:1241) 
    at com.stumbleupon.async.Deferred.access$300(Deferred.java:430) 
    at com.stumbleupon.async.Deferred$Continue.call(Deferred.java:1350) 
    <--cut--> 

Ich habe versucht, einige Arbeitsbeispiele fortgesetzt Scans zu finden mit asynchbase. OpenTSDB verwendet synchrone Scans mit scanner.nextRows().joinUninterruptibly(). Dieser Code ist aus HBase svn, sieht aus wie meins:

@Override 
    void testTimed() { 
      scanner.nextRows() 
      .addCallback(continueScan) 
      .addCallbacks(callback, errback); 
     } 

Auch in Asynchron-Dokumentation gibt es eine solche Phrase:

You must not build a cycle of mutually dependant Deferreds, as this would cause an infinite recursion (thankfully, it will quickly fail with a StackOverflowError)

aber ich denke, das ist nicht mein Fall ist.

Ich plane, asynchbase zu verfolgen, um herauszufinden, was mit meinem Code nicht stimmt, aber wenn mir jemand Arbeitsbeispiele von fortgesetzten Scans zeigen könnte, wäre es sehr hilfreich.

UPDATE: Dieser peinliche Moment, als Sie Stück Code ohne Fehler postete. Problem war im Anrufer. Ich musste einen Scan-Ende-Ausgang machen. Ich schrieb:

Scanner scanner = hclient.newScanner(TABLE); 
    <!--cut some initialization--!> 
    new AsyncScanner(scanner).start(); 
    hclient.shutdown().joinUninterruptibly(); 

Und die shutdown() beim Scannen waren das eigentliche Problem. Wenn shutdown() entfernt oder nach dem Scan aufgerufen wird, funktioniert alles gut.

Entschuldigung für die mögliche Verschwendung Ihrer Zeit.

+0

Könnten Sie freundlich Ihre Update als Antwort posten und akzeptieren es, diese Frage zu verhindern in unbeantwortet Warteschlange zu zeigen? – arghtype

+1

@arghtype natürlich – myas

Antwort

0

Kopie des Updates: Dieser peinliche Moment, wenn Sie Stück Code ohne Fehler posted. Problem war im Anrufer. Ich musste einen Scan-Ende-Ausgang machen. Ich schrieb:

Scanner scanner = hclient.newScanner(TABLE); 
<!--cut some initialization--!> 
new AsyncScanner(scanner).start(); 
hclient.shutdown().joinUninterruptibly(); 

Und diese Abschaltung() während des Scannens waren das eigentliche Problem. Wenn shutdown() entfernt oder nach dem Scan aufgerufen wird, funktioniert alles gut.

Es tut uns möglich, Ihre Zeit verschwenden

Verwandte Themen