redissonScheduling

使用Redisson分布式锁实现服务多节点部署,单节点执行定时任务,保证任务不会重复执行

1.技术点Scheduling、redisson;

redssion依赖 pom%

1
2
3
4
5
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>

2.配置redisson实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class RedissonConfig {
@Value("${redis.port}")
private int port;
@Value("${redis.host}")
private String host;
@Value("${redis.pass}")
private String pwd;

@Bean(destroyMethod = "shutdown")
public RedissonClient redissonClient() {
//1.创建配置
Config config = new Config();
config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(pwd);
//2、根据Config创建出来RedissonClient示例
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}

3.实战demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Scheduled(fixedRate = 1000 * 60)
public void RobinTask() throws ParseException {
//从reids中获取robinTaskLock这个值key
RLock lock = redissonClient.getLock("robinTaskLock");
log.info("robinTaskLock start");
//判断此key是否占用(不等待立马返回),没有占用返回true
if (lock.tryLock()) {
log.info("RobinTask available");
try {
//your code ...
}
} finally {
//判断这key是否由当前线程锁持有,根据自身需求可以不做该判断
if (lock.isHeldByCurrentThread()) {
//释放robinTaskLock锁,(同时删除redis中robinTaskLock这个key)
lock.unlock();
}
}
} else {
//key被占用根据自身业务做处理。
log.info("RobinTask not available");
}
}

更多redisson使用技巧请看官网