问题描述: 日常开发中不难遇到一些关于定时 执行 相关调度的一些业务场景, 其中又出现一些多种多样的任务调度方式,这个时候 Spring 的 Scheduled 就用上派场了。既然这样 那我们就用上这个碎片时间来一起了解一下这个 Scheduled 具体地一些用法和一些使用感受 吧 。
其实我们应该先了解的是Spring 的 @Scheduled工作原理, @Scheduled 本身是一个单线程,通过@EnableScheduling
注解进行启动我们的 Task ,当然 如果是 需要进行多线程处理的情况下我们只需要在方法或者类上加一个注解@EnableAsync
进行异步处理 。
日常开发中 最常用的 一个定时任务的做法应该 是下边这样:
@Scheduled(cron="******")
通过cron表达式的方式进行控制方法的执行周期.
/* desc */
@Scheduled(cron = "******")
public void processPosTransfer(){
transferService.processPosTransfer();
}
除了这一常见地使用方式其实有一些也是不可忽略地一些形式,Eg:@Scheduled(fixedDelay=5000),这个就是每隔5s执行一次,每次执行有延迟,这个延迟跟上次任务执行完之后开始计时
;如果需要有固定的执行 频率,当然 有一个属性fixedRate,@Scheduled(fixedRate=5000),这个就是 每隔5s进行 处理一次task,没有等待的一个延迟.
,另一种情况就是有固定延迟和固定执行频率地任务,就可以通过指定在首次执行方法之前要等待的毫秒数来指定初始延迟的毫秒时间@Scheduled(initialDelay=1000, fixedRate=5000)
。
其实这个@Scheduled是有一定的缺点,一旦工程启动之后 不能对任务调度的一个周期进行改变,既然基于这样地一个很常用但又有一些缺点的@Scheduled,如果有不能stop项目 进行修改任务调度周期地需求的话,那我们就可以引出一个SchedulingConfigurer类,可以重写这个类中的方法结合业务去实现一些需求。
SchedulingConfigurer是一个很不错的实现动态定时任务的接口,去实现这个接口就OK,有兴趣的话可以尝试去看一下SchedulingConfigurer里边的源码,看看其实现的一些流程什么的。
若有疏忽 ,欢迎指正 !