2016-12-15 4 views
2

Я пытаюсь использовать async java-клиент для чтения async. Я имею в виду, например, упомянутого в http://www.aerospike.com/docs/client/java/usage/asyncАбонентская блокировка клиента ASISK

Я использую ниже получить для чтения Get (BatchPolicy политики, RecordArrayListener слушателя, ключевые клавиши [])

Это прекрасно работает с несколькими запросами, однако после того, как делает почти ~ 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. Он не дает подробностей об этом в документации. Можете ли вы предложить, какое оптимальное значение должно быть установлено. –

 Смежные вопросы

  • Нет связанных вопросов^_^