java使用redis报错:Jedis [B cannot be cast to java.lang.Long
java使用redis报错:Jedis [B cannot be cast to java.lang.Long
·
背景
在开发代码的过程中,有时开发任务比较急,没有考虑jedis连接使用的情况,异步处理写好代码功能后。启动项目进行测试,由于这段代码处理的数据量很多,每秒大概10条左右,还会更多。运行报大量错误,报错信息为:Jedis [B cannot be cast to java.lang.Long,一开始没有发现问题,找了几个小时后,静下心来才发现这个问题。一开这段代码也是前同事写的,所以花了很多时间,也给我带来了很多麻烦和浪费了比较多的时间,特此记录。
报错代码
代码
public class RedisUtil {
private static final Logger logger = LoggerFactory.getLogger(RedisUtil.class);
@Autowired
private GlobalConfig globalConfig;
// 数据源
@Autowired
private JedisPool jedisPool;
@Autowired
private StringRedisTemplate stringRedisTemplate;
public RedisUtil() {
}
abstract class Executor<T> {
Jedis jedis;
public Executor(JedisPool jedisPool) {
this.jedis = jedisPool.getResource();
}
abstract T execute();
public T getResult() {
T result = null;
try {
result = execute();
} catch (Throwable e) {
logger.error("excute redis command error ~~~", e);
} finally {
if (null != jedis) {
jedis.close();
}
}
return result;
}
}
public ClasssA handle(Object obj...) throws IllegalArgumentException {
return new Executor<ClasssA>(jedisPool) {
@Override
ClasssA execute() {
try {
//这里传入jedis,相当于开启了一个线程传入jedis去使用,但是注意的人就会发现,开启一个线程的时候,之前的线程执行完毕之后会把jedis进行关闭
//所以异步处理的时候,这个jedis实例就会报这个错误
ClassTask classTask = new ClassTask(classsA, jedis); //修改方法,jedis改成传入stringRedisTemplate对象实例即可
ClassTask.threadPoolExecutor.execute(classTask);
} catch (Exception e) {
}
return coordinateDTO;
}
}.getResult();
}
}
更多推荐
已为社区贡献3条内容
所有评论(0)