我已经开始使用来自StumbleUpon的StumbleUpon库,并且在继续异步扫描时遇到了一些问题。基于对库原则的理解,我编写了这段代码:
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);
}此外,在异步文档中有这样的短语:
您不能构建一个相互依赖的Deferreds循环,因为这会导致无限递归(谢天谢地,StackOverflowError很快就会失败)
但我想这不是我的案子。
我计划跟踪异步库,以找出我的代码有什么问题,但是如果有人能给我展示继续扫描的工作示例,这将非常有帮助。
更新:这个尴尬的时刻,当你发布一段代码时没有出错。问题出在打电话的人身上。我需要做一个扫描结束出口。我写道:
Scanner scanner = hclient.newScanner(TABLE);
<!--cut some initialization--!>
new AsyncScanner(scanner).start();
hclient.shutdown().joinUninterruptibly();扫描时的shutdown()才是真正的问题。如果shutdown()在扫描完成后被删除或调用,那么所有操作都很好。
很抱歉浪费你的时间。
发布于 2014-10-16 21:28:48
更新副本:这个尴尬的时刻,当你发布一段代码时,没有错误。问题出在打电话的人身上。我需要做一个扫描结束出口。我写道:
Scanner scanner = hclient.newScanner(TABLE);
<!--cut some initialization--!>
new AsyncScanner(scanner).start();
hclient.shutdown().joinUninterruptibly();扫描时的关闭()才是真正的问题。如果在扫描完成后删除或调用了关机(),则所有操作都正常。
很抱歉浪费了你的时间
https://stackoverflow.com/questions/13564612
复制相似问题