Java创建一个异常long_Redisson操作异常: java.lang.ClassCastException: java.lang.Long cannot be cast to [B...

2642e05f4e192612887b05fd14da3ea9.gif

在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则不会!

参考链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值