用asynchbase扫描

mya*_*yas 10 hbase

我开始使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在大扫描中使用此代码我得到了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-->
Run Code Online (Sandbox Code Playgroud)

我试图找到一些使用asynchbase继续扫描的工作示例.OpenTSDB使用同步扫描scanner.nextRows().joinUninterruptibly().这个代码来自HBase svn,看起来像我的:

    @Override
    void testTimed() {
          scanner.nextRows()
            .addCallback(continueScan)
            .addCallbacks(callback, errback);
        }
Run Code Online (Sandbox Code Playgroud)

此外,在异步文档中有这样的短语:

你不能建立一个相互依赖的Deferreds的循环,因为这会导致无限递归(幸运的是,它会很快失败并出现StackOverflowError)

但我想,这不是我的情况.

我打算跟踪asynchbase以找出我的代码有什么问题,但如果有人能告诉我继续扫描的工作示例,那将非常有帮助.

更新: 这个尴尬的时刻你发布了一段没有错误的代码.问题在于打电话.我需要进行一次扫描结束退出.我写:

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

shutdown()而扫描时这是真正的问题.如果shutdown()在扫描完成后删除或调用,则一切正常.

对不起,可能会浪费你的时间.

mya*_*yas 0

更新副本:当您毫无错误地发布代码时,这个尴尬的时刻。问题出在呼叫者身上。我需要使一次扫描结束退出。我写:

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

扫描时的 shutdown() 才是真正的问题。如果在扫描完成后删除或调用 shutdown() ,则一切正常。

很抱歉可能浪费您的时间