Ked*_*ikh 5 concurrency locking java.util.concurrent jedis apache-commons-pool
我有一个运行多个线程的 tomcat - spring4.2 应用程序。每个线程仅从一个队列中出队,但是分配给一个队列的线程不止一个。
事情开始很好,但是在几个小时/大约 50 万个出队操作之后,我发现线程出队的速度非常慢。
在 jvisualvm 中看到橙色的线程 ie park 线程转储如下:
"EMLT_2" - Thread t@64
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <2cf42d7> (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 org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:48)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:86)
at com.mycomp.sam.processors.SimpleDequeuer.dequeue(SimpleDequeuer.java:25)
at com.mycomp.sam.processors.EMLT.run(EMLT.java:29)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"EMLT_1" - Thread t@63
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <2cf42d7> (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 org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:48)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:86)
at com.mycomp.sam.processors.SimpleDequeuer.dequeue(SimpleDequeuer.java:25)
at com.mycomp.sam.processors.EMLT.run(EMLT.java:29)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
Run Code Online (Sandbox Code Playgroud)
出队方法是:
public String dequeue(String queue) {
try (Jedis jedis = jedispool.getResource()) {
List<String> str = jedis.blpop(10, queue);
if(str!=null){
return str.get(1);
}
else
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
将欣赏输入。重新启动后,该应用程序再次运行良好。池配置:
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="10" />
<property name="maxTotal" value="70" />
<property name="minIdle" value="10" />
</bean>
<bean id="jedispool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="poolConfig" />
<constructor-arg name="host" value="${REDIS_HOST}" />
<constructor-arg name="port" value="6379" />
</bean>
Run Code Online (Sandbox Code Playgroud)
您的 jedis 池似乎已耗尽连接。您是否使用 returnResourceObject 或 returnResource 返回资源?(我知道两者都已弃用,但它们仍然适用于最新版本的 jedis)。
请记住,jedis 池与 DBCP/Apache 池并不完全相同。
我遇到了类似的问题,当我调用上面的方法时它就结束了。
另一方面,由于 Redis 非常快,也许您应该重新考虑您的架构,并且只有很少的线程调用 blpop (每个队列一个)并将值转发到其他线程,因此这些线程不了解 Redis,如果它们不必。
归档时间: |
|
查看次数: |
1420 次 |
最近记录: |