首页 > 解决方案 > jedis中的空指针异常

问题描述

我的日志充满了 Jedis 的这个异常,即使是日志级别信息我也不能忽略它

加载技术人员缓冲区耗时 2942 毫秒:在 org.apache 的 redis.clients.jedis.JedisFactory.validateObject(JedisFactory.java:152) 的 redis.clients.jedis.BinaryJedis.ping(BinaryJedis.java:187) 的 java.lang.NullPointerException .commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:534) 在 redis.clients.jedis.util.Pool.returnResourceObject(Pool.java:68) 在 redis.clients.jedis.JedisPool.returnResource(JedisPool.java :251) 在 redis.clients.jedis.Jedis.close(Jedis.java:3505) 在 com.puls.availability.services.AvailabilityServiceImpl.getAvailabilityBufferPerVertical(AvailabilityServiceImpl.java:360) 在 java.base/java.lang.Thread。在 redis.clients.jedis.JedisFactory 的 redis.clients.jedis.BinaryJedis.quit(BinaryJedis.java:255) 处运行 (Thread.java:834) java.lang.NullPointerException。org.apache.commons.pool2.impl.GenericObjectPool.destroy(GenericObjectPool.java:927) 的 destroyObject(JedisFactory.java:99) org.apache.commons.pool2.impl.GenericObjectPool.evict(GenericObjectPool.java:768)在 org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool.java:1138) 在 java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) 在 java.base /java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) 在 java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) 在 java.base/java.util.concurrent .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang。Thread.run(Thread.java:834) java.lang.NullPointerException at redis.clients.jedis.BinaryJedis.quit(BinaryJedis.java:255) at redis.clients.jedis.JedisFactory.destroyObject(JedisFactory.java:99) at org.apache.commons.pool2.impl.GenericObjectPool.evict(GenericObjectPool.java:768) 在 org.apache.commons.pool2 的 org.apache.commons.pool2.impl.GenericObjectPool.destroy(GenericObjectPool.java:927)。 impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool.java:1138) 在 java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) 在 java.base/java.util.concurrent.FutureTask。 runAndReset(FutureTask.java:305) 在 java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) 在 java.base/java.util.concurrent.ThreadPoolExecutor。runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834) java.lang.NullPointerException at redis.clients.jedis.BinaryJedis.quit(BinaryJedis.java:255) at redis.clients.jedis.JedisFactory.destroyObject(JedisFactory.java:99) at org.apache.commons.pool2.impl。 org.apache.commons.pool2.impl.GenericObjectPool.evict(GenericObjectPool.java:768) 在 org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool. java:1138) 在 java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) 在 java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) 在 java .base/java。util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834)

我的池配置是:

    final JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxTotal(128);
    poolConfig.setMaxIdle(128);
    poolConfig.setMinIdle(16);
    poolConfig.setTestOnBorrow(true);
    poolConfig.setTestOnReturn(true);
    poolConfig.setTestWhileIdle(true);
    poolConfig.setMinEvictableIdleTimeMillis(Duration.ofSeconds(60).toMillis());
    poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofSeconds(30).toMillis());
    poolConfig.setNumTestsPerEvictionRun(3);

这是我的 jedispool 创作:

new JedisPool(poolConfig, host, port, 1000);

它来自哪里?

标签: javaredisnullpointerexceptionthreadpoolexecutorjedis

解决方案


使这个问题难以解决的是异常的隐藏部分,

异常应如下所示:

load technicians buffer took 2942 miliseconds : java.lang.NullPointerException 
at co.elastic.apm.agent.redis.RedisSpanUtils.createRedisSpan(RedisSpanUtils.java:xxx)
at redis.clients.jedis.BinaryJedis.ping(BinaryJedis.java:187) 
at redis.clients.jedis.JedisFactory.validateObject(JedisFactory.java:152) 
at org.apache.commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:534) 
at redis.clients.jedis.util.Pool.returnResourceObject(Pool.java:68) 
at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:251) 
at redis.clients.jedis.Jedis.close(Jedis.java:3505) 
at .....

原始异常中缺少此行:co.elastic.apm.agent.redis.RedisSpanUtils.createRedisSpan(RedisSpanUtils.java:xxx)

异常发生在 Elastic 的 java APM代理中,但是由于代理使用的是 Java 的 Instrumentation API,所以没有跟踪该异常。

在等待 Elastic 解决问题时,您可以禁用代理侦听 Redis 请求。


推荐阅读