@Component
@Slf4j
public class TestLisenter extends KeyExpirationEventMessageListener {
@Autowired
private RedissonClient redissonClient;
@Autowired
private CommonCache commonCache;
public TestLisenter(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
try {
super.onMessage(message, pattern);
if (StringUtils.startsWith(message.toString(), KJBConstants.ACCESS_KEY)) {
boolean lockAcquired = false;
int maxRetries = 5; // 最大重试次数
int retries = 0; // 当前重试次数
RLock lock = redissonClient.getLock("kjbAccessKeyLock:" + message);
while (!lockAcquired && retries < maxRetries) {
try {
// 尝试获取锁,最多等待 5 秒钟
lockAcquired = lock.tryLock(5, TimeUnit.SECONDS);
if (lockAcquired) {
try {
// todo 业务逻辑
} finally {
lock.unlock(); // 释放锁
}
} else {
// 未能获取锁,重试
retries++;
Thread.sleep(100); // 重试间隔
}
} catch (InterruptedException e) {
// 处理中断异常
e.printStackTrace();
// 尝试重新标记中断状态,并继续重试
Thread.currentThread().interrupt();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
系统初始化RedisMessageListenerContainer bean 放到系统启动处
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
return container;
}