项目中创建定时任务是一种常见并且常用的技术,近几天我在整理项目的过程中,整理了springboot中通过@Scheduled 来创建定时任务,希望可以帮到大家,同时我也做一个记录。
- 首先我们需要两个注解来书写我们的定时任务的类,我这里的场景是清除数据库中已经废弃了的 ‘房间’ 的信息,这两个注解分别是:
- @Component :将这个类放到spring ioc 容器中来帮助我们管理这个类
- @Scheduled :开启定时任务,应用于方法上
- 这个类的代码如下
/**
* @ClassName ClearRoomScheduling
* @Description 清除废弃房间
* @Author zte
* @Date 2020/10/21 17:38
*/
@Slf4j //日志注解类,根据自己的需要引入
@Component
public class ClearRoomScheduling {
@Autowired
private IRoomService roomService;
@Autowired
private IRoomConfigService roomConfigService;
/**
* 添加定时任务,每隔5秒钟调用一次
*/
// @Scheduled(cron = "0/5 * * * * ?")
//也可以使用下面那种方式来规定自己定时任务的执行间隔
//或直接指定时间间隔,例如:5秒
@Scheduled(fixedRate=5000)
public void testJobs(){
/**
* 这个方法就是我们需要通过定时任务来做的事情
* 每个人的业务场景不同,业务逻辑也不尽相同
* 方法里面的代码可以直接替换成自己的
*/
List<Room> roomList = roomService.list(new LambdaQueryWrapper<Room>().eq(Room::getRoomStatus, Room.ROOM_ING));
List<Room> roomListTemp = new ArrayList<>();
//读取配置
List<RoomConfig> roomConfigs = roomConfigService.list();
RoomConfig roomConfig = roomConfigs.get(0);
for (Room room : roomList) {
LocalDateTime createTime = room.getCreateTime();
LocalDateTime now = LocalDateTime.now();
ChronoUnit chronoUnit = SECONDS;
long times = DateUtil.bewteenTwoTimes(createTime, now,chronoUnit);
if(times > roomConfig.getWaitTime()){
room.setRoomStatus(Room.ROOM_JIESAN);
roomListTemp.add(room);
}
}
if (!CollectionUtils.isEmpty(roomListTemp)) {
roomService.updateBatchById(roomListTemp);
}
}
}
- 最后我们需要在springboot 的启动类上面加上启动定时任务的注解@EnableScheduling
后面我会整理一篇SpringBoot集成Quartz 的作业调度框架,大家也可以参考这篇博客:SpringBoot2.0.3整合Quartz2.3.0实现定时任务