定时任务 & 异步
用于实现定时执行任务(如定时备份数据)、异步调用(如异步发送短信),提升项目性能和灵活性。
| 注解 | 作用说明 |
|---|---|
@EnableScheduling |
开启定时任务功能,必须加在启动类上,否则定时任务不生效 |
@Scheduled |
标记方法为定时任务,通过 cron 表达式或 fixedRate 设定执行规则 |
@EnableAsync |
开启异步调用功能,必须加在启动类上,否则异步方法不生效 |
@Async |
标记方法为异步执行,调用该方法时会开启新线程,不阻塞主线程 |
// 1. 启动类(开启定时任务和异步)
@SpringBootApplication
@EnableScheduling // 开启定时任务
@EnableAsync // 开启异步调用
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// 2. 定时任务(@Scheduled)
@Component
public class ScheduledTask {
// 方式1:cron 表达式(每5秒执行一次)
@Scheduled(cron = "0/5 * * * * ?")
public void cronTask() {
System.out.println("Cron 定时任务执行:" + System.currentTimeMillis());
}
// 方式2:固定速率(每隔3秒执行一次,不管上一次是否执行完)
@Scheduled(fixedRate = 3000)
public void fixedRateTask() {
System.out.println("固定速率定时任务执行");
}
}
// 3. 异步调用(@Async)
@Service
public class AsyncService {
// 标记方法为异步执行
@Async
public void asyncMethod() {
try {
// 模拟耗时操作(如发送短信、调用第三方接口)
Thread.sleep(3000);
System.out.println("异步方法执行完成(耗时3秒)");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 4. 测试异步调用(不阻塞主线程)
@RestController
@RequestMapping("/async")
public class AsyncController {
@Autowired
private AsyncService asyncService;
@GetMapping("/test")
public String testAsync() {
// 调用异步方法(开启新线程执行,主线程直接返回)
asyncService.asyncMethod();
// 主线程不阻塞,立即返回
return "异步方法已触发,可查看控制台输出";
}
}