【问题标题】:Aerospike Java Async client blockingAerospike Java 异步客户端阻塞
【发布时间】:2016-12-17 01:01:01
【问题描述】:

我正在尝试使用异步 java 客户端进行异步读取。我指的是中提到的示例 http://www.aerospike.com/docs/client/java/usage/async

我在下面使用 get 进行阅读 get(BatchPolicy 策略,RecordArrayListener 监听器,Key[] 键)

这适用于很少的请求,但是在发出近约 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)

谁能建议我为什么会发生这种情况或如何防止这种情况发生。

【问题讨论】:

    标签: java multithreading aerospike


    【解决方案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查看在线文档

    【讨论】:

    • 嘿,这行得通。我使用了一个固定大小的线程池 Executors.newFixedThreadPool(asyncClientPolicy.asyncMaxCommands) 在 AsyncClientPolicy 我们有一个配置 asyncSelectorThreads。它在文档中没有提供太多关于它的细节。您能否建议将其设置为最佳值。
    猜你喜欢
    • 2016-07-14
    • 2020-10-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2014-11-26
    • 2013-11-21
    • 2020-11-12
    相关资源
    最近更新 更多