![图片[1]-Redisson操作异常: java.lang.ClassCastException: java.lang.Long cannot be cast to [B-JoyCode 斑马快跑](https://qiniu.joycode.com.cn/2019/08/20191120084459725691.jpg)
在Spring boot应用中使用Redisson时出现一个奇怪的异常:
java.lang.ClassCastException: java.lang.Long cannot be cast to [B
后来发现是由于使用了默认注入的RedissionClient对象导致的!看下面的单元测试代码:
...
@Slf4j
public class LockTest extends BaseTest {
    private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(20, 2000, 30, TimeUnit.MINUTES, new ArrayBlockingQueue<>(2000));
    @Autowired
    private RedissonClient redissonClient1;
    private RedissonClient redissonClient2;
    @Before
    public void before() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://192.168.2.200:6379").setPassword("4J^wxw3@#qjpo0D!");
        redissonClient2 = Redisson.create(config);
    }
    @Test
    public void rlockTest1() throws Exception {
        RLock rLock = redissonClient1.getLock("test");
        try {
            rLock.lock();
            Thread.sleep(3000);
            rLock.unlock();
            log.info("==================== success");
        } catch (Exception e) {
            log.error("", e);
        }
    }
    @Test
    public void rlockTest2() throws Exception {
        for (int i = 0; i < 1000; i++) {
            threadPoolExecutor.submit(new LockTestTaskThread(redissonClient2));
        }
        while (!threadPoolExecutor.isShutdown()) {
            Thread.sleep(1000);
        }
    }
}
测试用的线程类代码:
...
@Slf4j
public class LockTestTaskThread extends Thread {
    private RedissonClient redissonClient;
    public LockTestTaskThread(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }
    @Override
    public void run() {
        log.info("Thread id {}:", getId());
        RLock rLock = redissonClient.getLock("test");
        try {
            rLock.lock();
            log.info("{} lock is:{}", getId(), ObjectMapperUtil.toJsonString(rLock));
            Thread.sleep(5000);
            log.info("{} task complete", getId());
            rLock.unlock();
        } catch (Exception e) {
            log.error("Thread id {} error", getId(), e);
        }
    }
}
如果在rlockTest2()方法中使用Spring自动注入的redissionClient1,就会抛出该异常,使用新创建建的redissionClient2则不会!
参考链接:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    


















