首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Aerospike Java异步库似乎被卡住了

Aerospike Java异步库似乎被卡住了
EN

Stack Overflow用户
提问于 2017-07-26 00:01:19
回答 1查看 118关注 0票数 3

我正在使用aeropike client执行udf。客户端已初始化为:-

代码语言:javascript
运行
复制
    try {
        asyncClientPolicy.maxThreads = 40;
        asyncClientPolicy.asyncMaxCommands = 20;
        asyncClientPolicy.maxSocketIdle = 13;
        asyncClientPolicy.asyncMaxCommandAction = MaxCommandAction.BLOCK;
        asyncClientPolicy.asyncSelectorThreads = 7;
        asyncClientPolicy.asyncTaskThreadPool = Executors.newFixedThreadPool(20, new ThreadFactory() {
            public final Thread newThread(Runnable runnable) {
                Thread thread = new Thread(runnable);
                thread.setDaemon(true);
                return thread;
            }
        });
    }

所以我有20个线程来处理回调。过了一段时间后,我发现我的程序没有任何进展,这表明存在死锁/饥饿。Jstack给出了以下结果:

代码语言:javascript
运行
复制
java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x000000064048f338> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:374)
    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.AsyncClient.execute(AsyncClient.java:949)
    at main.java.labs.RuleEngineAerospikeConnection.updatePositiveSegmentsUDF(RuleEngineAerospikeConnection.java:217)
    at main.java.labs.Segment$ProductChecker.onSuccess(Segment.java:346)
    at com.aerospike.client.async.AsyncRead.onSuccess(AsyncRead.java:149)
    at com.aerospike.client.async.AsyncCommand.finish(AsyncCommand.java:293)
    at com.aerospike.client.async.AsyncSingleCommand.read(AsyncSingleCommand.java:59)
    at com.aerospike.client.async.AsyncCommand.run(AsyncCommand.java:261)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

我正好有20个线程处于等待状态,所有线程都在execute命令上。我是不是做错了什么设置,因为我希望客户端返回,即使我的UDF中有任何异常,如果有一个无限循环会发生什么?这会导致这种行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-27 08:34:46

如果不看源代码就很难说出是什么导致了你的死锁。您的AsyncClientPolicy看起来足够了。

无论如何,从version 4开始,旧的AsyncClient类就已经过时了。AerospikeClient类现在包括新的异步方法,这些方法的执行速度必须比旧的AsyncClient快。新的异步方法还支持Netty事件循环,并始终以非阻塞模式运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45308357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档