背景

在开发代码的过程中,有时开发任务比较急,没有考虑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();
    }


   

}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐