我开始使用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-->
我试图找到一些使用asynchbase继续扫描的工作示例。 OpenTSDB使用scanner.nextRows().joinUninterruptibly()
的同步扫描。来自HBase svn的代码看起来像我的代码:
@Override
void testTimed() {
scanner.nextRows()
.addCallback(continueScan)
.addCallbacks(callback, errback);
}
另外,在异步文档中有这样的短语:
你不能构建一个相互依赖的Deferreds循环,因为这会导致无限递归(幸运的是,它会很快因StackOverflowError而失败)
但我认为,这不是我的情况。
我打算跟踪asynchbase以找出我的代码有什么问题,但如果有人能告诉我继续扫描的工作示例,那将会非常有帮助。
更新 当你发布一段没有错误的代码时,这个尴尬的时刻。 问题在于打电话。我需要进行一次扫描结束退出。我写道:
Scanner scanner = hclient.newScanner(TABLE);
<!--cut some initialization--!>
new AsyncScanner(scanner).start();
hclient.shutdown().joinUninterruptibly();
扫描时shutdown()
是真正的问题。如果在扫描完成后移除或调用shutdown()
,则一切正常。
抱歉可能会浪费你的时间。
答案 0 :(得分:0)
更新副本: 当你发布一段没有错误的代码时,这个尴尬的时刻。问题在于打电话。我需要进行一次扫描结束退出。我写道:
Scanner scanner = hclient.newScanner(TABLE);
<!--cut some initialization--!>
new AsyncScanner(scanner).start();
hclient.shutdown().joinUninterruptibly();
扫描时关闭()是真正的问题。如果在扫描完成后删除或调用shutdown(),则一切正常。
抱歉可能会浪费你的时间