java - 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);
它来自哪里?
解决方案
使这个问题难以解决的是异常的隐藏部分,
异常应如下所示:
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 请求。
推荐阅读
- kubernetes - IstIO Ingress Gateway 上 Nginx Ingress Annonations 的等价物
- c++ - 在 CLion 中调试时程序收到分段错误
- python - 列表列表增长后的奇怪行为
- sql - SQL 查询案例 when then 在 where 子句中
- php - 奏鸣曲管理员上的自定义批处理操作
- matlab - 你如何解决“未定义的函数或变量'mamfis'”?
- snowflake-cloud-data-platform - 如何将列数据类型从 boolean 更改为 varchar(50)?
- css - Chrome 在两台电脑上计算 CSS 不同
- javascript - 将servelt中的字符串转换为json数据并将其传递给javascript:ajax
- android - React Native 应用程序在启动时崩溃 - Android