我開始使用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()
刪除或掃描完成後調用,所有的作品都很好。
對不起,可能會浪費你的時間。
你能親切地發表您的更新作爲一個答案,並接受它,以防止這個問題的解答中的隊列顯示? – arghtype
@arghtype當然 – myas