2012-11-26 142 views
10

我開始使用StumbleUpon的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; 
    } 
} 

但隨着大掃描這些代碼我已經得到的StackOverflowError:

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--> 

我試圖找到繼續掃描的一些工作實例與異步基地。 OpenTSDB與scanner.nextRows().joinUninterruptibly()使用同步掃描。這從HBase svn代碼,看起來像我:

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

此外,異步文件中有這樣一句話:

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)

,但我認爲,這不是我的情況。

我打算跟蹤asynchbase來找出我的代碼有什麼問題,但是如果任何人都可以向我展示持續掃描的工作示例,那將非常有幫助。

更新: 這個尷尬的時刻,當你貼一段代碼沒有錯誤。 問題在調用者。我需要將一個掃描結束出口。我寫道:

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

而這shutdown()掃描時是真正的問題。如果shutdown()刪除或掃描完成後調用,所有的作品都很好。

對不起,可能會浪費你的時間。

+0

你能親切地發表您的更新作爲一個答案,並接受它,以防止這個問題的解答中的隊列顯示? – arghtype

+1

@arghtype當然 – myas

回答

0

更新副本: 這個尷尬的時刻,當你張貼一段代碼沒有錯誤。問題在打電話。我需要將一個掃描結束出口。我寫道:

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

而這個關機(),而掃描是真正的問題。如果在掃描完成後刪除或調用shutdown(),則所有工作都很順利。

對不起,可能浪費你的時間