Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Aerospike Java异步客户端阻塞_Java_Multithreading_Aerospike - Fatal编程技术网

Aerospike Java异步客户端阻塞

Aerospike Java异步客户端阻塞,java,multithreading,aerospike,Java,Multithreading,Aerospike,我正在尝试使用异步java客户机进行异步读取。我所指的例子是 我正在使用下面的get进行阅读 获取(BatchPolicy策略,RecordArrayListener侦听器,键[]键) 这在请求很少的情况下可以正常工作,但是在发出大约50000个请求后,线程进入无限等待状态。下面是其中一个线程的堆栈跟踪 "pool-11-thread-1" - Thread t@56 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(

我正在尝试使用异步java客户机进行异步读取。我所指的例子是

我正在使用下面的get进行阅读 获取(BatchPolicy策略,RecordArrayListener侦听器,键[]键)

这在请求很少的情况下可以正常工作,但是在发出大约50000个请求后,线程进入无限等待状态。下面是其中一个线程的堆栈跟踪

"pool-11-thread-1" - Thread t@56
   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)
“池-11-thread-1”-线程t@56
java.lang.Thread.State:正在等待
在sun.misc.Unsafe.park(本机方法)
-停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
位于java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403)
位于com.aerospeck.client.async.AsyncCluster$BlockBufferQueue.getByteBuffer(AsyncCluster.java:114)
位于com.aerospeck.client.async.AsyncCluster.getByteBuffer(AsyncCluster.java:68)
在com.aerospeck.client.async.AsyncCommand.execute上(AsyncCommand.java:59)
位于com.aerospeck.client.async.AsyncMul tiExecutor.execute(asyncmultiexector.java:36)
位于com.aerospeck.client.async.AsyncBatch$GetArrayExecutor。(AsyncBatch.java:249)
位于com.aerospeck.client.async.AsyncClient.get(AsyncClient.java:568)

有人能告诉我为什么会发生这种情况或如何防止这种情况。

当发出嵌套的异步命令时,异步客户端可能会死锁。要修复死锁,请定义一个任务线程池,该线程池将异步回调(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);

请参见在线文档,网址为

Hey this works。我使用一个固定大小的线程池Executors.newFixedThreadPool(asyncClientPolicy.asyncMaxCommands)在asyncClientPolicy中我们有一个配置asyncSelectorThreads。文档中没有给出太多的细节。你能建议这应该设置什么样的最佳值吗。