2016-12-15 1 views
2

비동기 읽기 용으로 async java 클라이언트를 사용하려고합니다. 나는 GET (BatchPolicy 정책, RecordArrayListener 리스너, 키 [] 키)Aerospike Java 비동기 클라이언트 차단

이 그러나 거의 한 후, 몇 요청과 잘 작동을 읽을 얻을 아래 사용하고 http://www.aerospike.com/docs/client/java/usage/async

에 언급 된 예를 참조하고 ~ 50000 요청이 있으면 스레드가 무기한 대기 상태가됩니다. 아래는 스레드 중 하나에 대한 스택 추적입니다.

"pool-11-thread-1" - Thread [email protected] 
    java.lang.Thread.State: WAITING 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <737890e3> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403) 
    at com.aerospike.client.async.AsyncCluster$BlockBufferQueue.getByteBuffer(AsyncCluster.java:114) 
    at com.aerospike.client.async.AsyncCluster.getByteBuffer(AsyncCluster.java:68) 
    at com.aerospike.client.async.AsyncCommand.execute(AsyncCommand.java:59) 
    at com.aerospike.client.async.AsyncMul tiExecutor.execute(AsyncMultiExecutor.java:36) 
    at com.aerospike.client.async.AsyncBatch$GetArrayExecutor.<init>(AsyncBatch.java:249) 
    at com.aerospike.client.async.AsyncClient.get(AsyncClient.java:568) 

누구나 왜 이런 일이 일어날 지 또는 어떻게 방지 할 수 있는지 제안 할 수 있습니까?

답변

1

중첩 된 비동기 명령이 발행 될 때 비동기 클라이언트가 교착 상태가 될 수 있습니다. 교착 상태를 수정하려면 비동기 콜백 (onSuccess())을 스레드 풀에 오프로드하는 작업 스레드 풀을 정의하여 선택기 스레드를 해제하여 다른 명령을 처리하십시오. 다음은 그 예이다 :

AsyncClientPolicy policy = new AsyncClientPolicy(); 
policy.asyncTaskThreadPool = Executors.newCachedThreadPool(new ThreadFactory() { 
     public final Thread newThread(Runnable runnable) { 
      Thread thread = new Thread(runnable); 
      thread.setDaemon(true); 
      return thread; 
     } 
    }); 
AsyncClient client = new AsyncClient(policy, host, port); 

https://github.com/citrusleaf/aerospike-client-java/blob/master/client/src/com/aerospike/client/async/AsyncClientPolicy.java

+0

에서 안녕이 작품의 온라인 문서를 참조하십시오. 고정 된 크기의 스레드 풀을 사용합니다. Executors.newFixedThreadPool (asyncClientPolicy.asyncMaxCommands) AsyncClientPolicy에는 asyncSelectorThreads 구성이 있습니다. 문서에서 이에 대한 세부 정보를 많이 제공하지는 않습니다. 이것이 최적의 값으로 설정되어야한다고 제안 할 수 있습니까? –