简单的办法就是用基于注解(@Scheduled)方法。
- SpringBoot启动类增加注解
@EnableScheduling启动定时任务
- 实现类增加注解
@Component主要用于标记配置类,兼备Component的效果。
- 实现方法增加注解
// 凌晨1点执行
@Scheduled(cron = "${ims.sync.corn-expression}")
public void syncFolderJob() throws InterruptedException {
String[] appCodeArr = appCodes.split(",");
for (String appCode : appCodeArr) {
long startTime = System.currentTimeMillis(); // 代码执行前时间
Future<String> taskSyncFolder = folderService.syncFolder(appCode);
if(taskSyncFolder.isDone()) {
break;
}
Thread.sleep(1000);
long endTime = System.currentTimeMillis(); // 代码执行后时间
Calendar c = Calendar.getInstance();
c.setTimeInMillis(endTime - startTime);
log.info("应用:" + appCode + " 执行结束,耗时: " + c.get(Calendar.MINUTE) + "分 " +
c.get(Calendar.SECOND) + "秒 ");
}
}
@Scheduled除了支持灵活的参数表达式cron之外,还支持简单的延时操作,例如 fixedDelay ,fixedRate 填写相应的毫秒数即可。
这里我是在application.yml配置的corn执行时间。
Cron表达式参数分别表示:
秒(0~59) 例如0/5表示每5秒
分(0~59)
时(0~23)
日(0~31)的某天,需计算
月(0~11)
周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
corn在线生成地址:cron.qqe2.com
多线程启用定时任务方法:
-
启动类增加注解
@EnableAsync启用多线程注解 -
实现类和实现方法增加注解
@Component
@EnableScheduling // 1.开启定时任务
@EnableAsync // 2.开启多线程
public class SyncFolderScheduled {
@Async
@Scheduled(fixedDelay = 1000) //间隔1秒
public void first() throws InterruptedException {
System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
Thread.sleep(1000 * 10);
}
@Async
@Scheduled(fixedDelay = 2000)
public void second() {
System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
}
}
到此,感谢各位观看。如果有不对的地方还请各位大佬指教。