1.在定时任务类上加上注解 @EnableScheduling,开启定时任务管理,
使用@PostConstruct 注解,进行初始化操作,并设置多任务线程池:
@Slf4j
@RequiredArgsConstructor
@EnableScheduling
@Component
public class ScheduleExecuteTaskUtil{
private static final Map<String, Object> SCHEDULED_TASK_MAP = new LinkedHashMap<>();
private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
@PostConstruct
public void initTaskList() {
//设定一个长度为10的定时任务线程池
scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(10);
//初始化当前任务 启动自动任务
initScheduledTask();
}
}
2.在定时任务加上注解 @Scheduled,fixedDelay为固定延迟时间,单位为ms:
@Scheduled(fixedDelay = 5 * 60 * 1000)
public void scheduledTaskUpdate() {
log.info("定时执行自动任务");
initScheduledTask();
}
3.定时执行线程池任务,每个机台使用一个线程,
scheduleWithFixedDelay(Runnable command,long initialDelay,long period,TimeUnit unit)
第一个command参数是任务实例,
第二个initialDelay参数是初始化延迟时间,
第三个period参数是间隔时间,
第四个unit参数是时间单元
private void initScheduledTask() {
//遍历各机台添加自动任务进行执行
List<MachineInfo> machineInfoList = machineInfoMapper.selectList(lqw);
for (MachineInfo machineInfo : machineInfoList) {
this.addScheduledTask(machineInfo.getMachineId());
}
}
private void addScheduledTask(String machineId) {
if (!SCHEDULED_TASK_MAP.containsKey(machineId)) {
ScheduledFuture<?> runnableFuture = scheduledThreadPoolExecutor.scheduleWithFixedDelay(() -> {
//机台监控任务
machineMonitorService.executeMonitor(machineId);
}, 1, 1, TimeUnit.SECONDS);
SCHEDULED_TASK_MAP.put(machineId, runnableFuture);
}
}
注意:开启了多线程之后,需要注意可能会出现重复操作,导致数据异常,需要做其他处理。