Springboot整合定時任務Task
涉及到的知識點
- @EnableScheduling //開啟定時任務
- @Scheduled(fixedRate = 3000) //注解頻率
- cron表達式 //參見:http://cron.qqe2.com/
在application的啟動類添加@EnableScheduling注解油啤,開啟定時任務敷矫,會自動掃描
//開啟定時任務
@EnableScheduling
application開啟任務注解
定義@Component作為組件和和@Scheduled注解被容器掃描
測試定時任務TestTask.java
@Component
public class TestTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
// 定義每過3秒執(zhí)行任務
@Scheduled(fixedRate = 3000) //每隔3秒執(zhí)行
// @Scheduled(cron = "4-40 * * * * ?") //定時任務--4秒~40秒結束,每分鐘重復
public void reportCurrentTime() {
System.out.println("現(xiàn)在時間:" + dateFormat.format(new Date()));
}
}
每隔3秒打印情況
定時任務表達式的簡單講解與應用
springboot的cron不支持年撒轮,所有只有6位
cron表達式的自動生成:http://cron.qqe2.com/
cron表達式自動生成
Springboot整合--異步任務
在application的啟動類添加@EnableAsync注解,開啟異步任務
//開啟異步調(diào)用方法
@EnableAsync
定義@Component和作為組件和@Async注解被容器掃描
異步任務AsyncTask.java
@Component
public class AsyncTask {
@Async
public Future<Boolean> doTask11() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(1000);
long end = System.currentTimeMillis();
System.out.println("任務1耗時:" + (end - start) + "毫秒");
return new AsyncResult<>(true); //表示異步任務完成
}
@Async
public Future<Boolean> doTask22() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(700);
long end = System.currentTimeMillis();
System.out.println("任務2耗時:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
@Async
public Future<Boolean> doTask33() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(600);
long end = System.currentTimeMillis();
System.out.println("任務3耗時:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
}
調(diào)用異步任務的Controller
@RestController
@RequestMapping("tasks")
public class DoTask {
@Autowired
private AsyncTask asyncTask; //異步任務注入
@RequestMapping("test1")
public String test1() throws Exception {
long start = System.currentTimeMillis();
Future<Boolean> a = asyncTask.doTask11(); //調(diào)用異步任務11
Future<Boolean> b = asyncTask.doTask22(); //調(diào)用異步任務22
Future<Boolean> c = asyncTask.doTask33(); //調(diào)用異步任務33
while (!a.isDone() || !b.isDone() || !c.isDone()) { //用于判斷異步任務是否完成
if (a.isDone() && b.isDone() && c.isDone()) {
break;
}
}
long end = System.currentTimeMillis();
String times = "任務全部完成利耍,總耗時:" + (end - start) + "毫秒";
System.out.println(times);
return times;
}
}
啟動項目測試
http://localhost:8080/tasks/test1
會發(fā)現(xiàn)是否開啟@EnableAsync注解執(zhí)行時間是不一樣
沒用注解@EnableAsync任務執(zhí)行情況
開啟異步的結果
異步任務的使用場景
- 數(shù)據(jù)清算(如證券交易的清算)
- 違規(guī)處理(如微信號違規(guī)分析)
- 發(fā)送短息
- 發(fā)送郵件
- app推送