研发说:API 请求量到底啥情况呀?统计发粗来(万一访问量一直激增,导致服务宕了,要扣我绩效滴)。
运维说:定期统计一下服务器内存、CPU占用率(万一出故障了,这个锅谁来背?)
业务说:记得把订单支付状态通知一下业务线(我很谨慎,不然都不知道钱支付出去了,妥妥避坑)。
产品说:把每天凌晨 2 点通知用户还款功能简单实现一下(功能很简单,上午实现,下午上线,怎么实现我不管)。
运营说:把每月的业务情况统计粗来(我要向上管理,向上汇报要用到)。
财务说:把账户日末余额统计统计,发个报表粗来(我要去谈费率,为公司节省成本,不然年底就没奖杯可拿啦)。
老板说:每月 15 号发工资,记得把发薪结果统计粗来(我看看到底还能再创(砍)多少辉(人)煌(头))。
很显然,如上需求大概率都需要定时任务来支撑。在日常项目研发中,定时任务可谓是必不可少的一环。本次主要借助 Spring Boot 来谈谈如何实现定时任务。
1. 静态定时任务
所谓静态定时任务是指应用跑起来后,任务的执行时间无法进行动态修改。实现起来也比较简单,只需通过 Spring Boot 内置注解 @Scheduled 来实现,默认是启动单线程来跑任务,可以通过配置线程池开启多线程,下面逐一学习一下。
1.1. 单线程定时任务
1.1.1 开启定时任务功能
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@EnableScheduling:用来开启定时任务功能,可以检测 Spring 管理的 bean 上 @Scheduled 的注解,系统默认会自动启动一个线程,来调度执行定时任务。
1.1.2 创建任务类
@Component
public class DownLoadTask {
private static final Log logger = LogFactory.getLog(DownLoadTask.class);
@Scheduled(cron = "0 0/5 * * * ?")
public void justDoIt() {
logger.info("开始下载银行对账文件");
logger.info("银行对账文件下载完成,进行解密操作");
logger.info("银行对账文件下载解密完成");
}
}
@Scheduled:主要用来完成任务的配置,如执行时间、间隔时间、延迟时间等等,其中有如下配置格式,可以自行体验体验。
1.1.3 运行验证
实现了一个每 5 分钟去银行下载一个对账文件的任务,跑起来效果如下。