Springboot整合定时任务Task
涉及到的知识点
- @EnableScheduling //开启定时任务
- @Scheduled(fixedRate = 3000) //注解频率
- cron表达式 //参见:http://cron.qqe2.com/
在application的启动类添加@EnableScheduling注解,开启定时任务,会自动扫描
//开启定时任务
@EnableScheduling

定义@Component作为组件和和@Scheduled注解被容器扫描
测试定时任务TestTask.java
@Component
public class TestTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
// 定义每过3秒执行任务
@Scheduled(fixedRate = 3000) //每隔3秒执行
// @Scheduled(cron = "4-40 * * * * ?") //定时任务--4秒~40秒结束,每分钟重复
public void reportCurrentTime() {
System.out.println("现在时间:" + dateFormat.format(new Date()));
}
}

定时任务表达式的简单讲解与应用
springboot的cron不支持年,所有只有6位
cron表达式的自动生成:http://cron.qqe2.com/

Springboot整合--异步任务
在application的启动类添加@EnableAsync注解,开启异步任务
//开启异步调用方法
@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);
}
}
调用异步任务的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(); //调用异步任务11
Future<Boolean> b = asyncTask.doTask22(); //调用异步任务22
Future<Boolean> c = asyncTask.doTask33(); //调用异步任务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
会发现是否开启@EnableAsync注解执行时间是不一样


异步任务的使用场景
- 数据清算(如证券交易的清算)
- 违规处理(如微信号违规分析)
- 发送短息
- 发送邮件
- app推送
网友评论