定时任务
定时任务是在编码世界中经常遇到的问题,比如定时备份数据库、定时刷新缓存等,可以通过Linux定时任务完成,也可以通过框架如Spring完成,但是在分布式场景中传统单机可以完成功能就不太行了,所以需要借助其他工具来实现任务调度的功能
场景:在一些订单场景中,用户下单后会锁定一些资源,然后用户非正常退出(没有触发取消订单操作),导致订单资源占用无法释放的问题。
借助工具:redisson分布式服务中的分布式调度任务服务(Scheduler Service)
代码
关单任务
定时执行具体任务,主要实现关单,释放相关资源(优惠券等),设置相关状态标志位
注意:Runnable、Callable接口二选一,必须实现序列化字段,因为任务最终要被序列化存储在Redis中
@Slf4j
@Data
public class CloseOrderTask implements Runnable, Serializable {
private static final long serialVersionUID = -8193920383968460660L;
/**
* 订单id
*/
private String orderId;
@Override
@SneakyThrows
public void run() {
// 获取SpringBean,因为此对象不能为Spring所管理,所以需要通过工具获取SpringBean
RedissonClient redissonClient = SpringUtils.getBean(RedissonClient.