Skip to content

定时任务 & 异步

用于实现定时执行任务(如定时备份数据)、异步调用(如异步发送短信),提升项目性能和灵活性。

注解 作用说明
@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 "异步方法已触发,可查看控制台输出";
    }
}