2012-11-26 7 views
10

StumbleUpon에서 asynchbase 라이브러리를 사용하기 시작했으며 계속 된 비동기 스캔에 몇 가지 문제가 있습니다.비동기 스캔

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

내가 계속 스캔의 일부 작업 예제를 찾을려고 노력 :

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가있어 큰 스캔에이 코드 : 나는 도서관 원리에 대한 이해를 기반으로,이 코드를 작성 asynchbase. 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를 추적 할 계획이지만, 아무도 내가 계속 스캔 작업 예제를 보여줄 수 있다면 매우 유용 할 것입니다.

UPDATE : 당신이 오류없이 코드의 조각을 게시이 어색한 순간. 발신자에게 문제가 발생했습니다. 한 번의 스캔 종료를해야했습니다. 내가 쓴 :

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()이 제거되거나 호출되면 모든 것이 정상적으로 작동합니다.

죄송 가능한 답이 대기열에 표시하려면이 문제를 방지하기 위해 시간