SpringBoot实现定时任务
SpringBoot定时任务(schedule、quartz)

SpringBoot定时任务(schedule、quartz)Scheduled 只适合处理简单的计划任务,不能处理分布式计划任务。
优势:是spring框架提供的计划任务,开发简单,执⾏效率⽐较⾼。
且在计划任务数量太多的时候,可能出现阻塞,崩溃,延迟启动等问题。
Scheduled定时任务是spring3.0版本之后⾃带的⼀个定时任务。
其所属Spring的资源包为:spring-context-support。
所以需要使⽤Scheduled定时任务机制时,需要在⼯程中依赖对应资源,具体如下:<!-- scheduled所属资源为spring-context-support --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId></dependency> 如果在spring应⽤中需要启⽤Scheduled定时任务,则需要在启动类上增加注解@EnableScheduling,代表启⽤Scheduled定时任务机制。
具体如下:@SpringBootApplication@EnableSchedulingpublic class AppStarter { public static void main(String[] args) { SpringApplication.run(AppStarter.class, args); }} Scheduled定时任务的核⼼在于注解@Scheduled,这个注解的核⼼属性是cron,代表定时任务的触发计划表达式。
这个表达式的格式为:@Scheduled(cron="seconds minutes hours day month week") 或@Scheduled(cron="seconds minutes hours day month week year") 推荐使⽤第⼀种表达式形式,因为在很多其他技术中都有不同的定时任务机制,其中⽤于设置触发计划的表达式都是第⼀种cron表达式。
SpringBoot使用注解形式定时执行同步任务

SpringBoot使用注解形式定时执行同步任务
```
public class Application
public static void main(String[] args)
}
```
- `fixedRate`:任务开始后的固定间隔时间(以毫秒为单位)- `fixedDelay`:任务结束后的固定间隔时间(以毫秒为单位)- `initialDelay`:任务首次执行的延迟时间(以毫秒为单位)- `cron`:使用Cron表达式来设置任务的执行时间
下面是一个使用注解形式定时执行同步任务的示例:
```
public class MyTask
public void executeTas
//执行任务的代码
System.out.println("定时任务执行");
}
```
在上面的示例中,`executeTask`方法将以固定的1秒间隔执行。
每次执行任务时,将输出"定时任务执行"。
需要注意的是,定时任务默认是在单个线程中执行的。
如果一个任务的执行时间超过了任务的间隔时间,那么下一个任务将等待上一个任务完成后才会执行。
总结起来,使用注解形式定时执行同步任务可以极大地简化定时任务的管理和实现。
通过注解,可以方便地设置任务的执行时间,并且可以灵活地使用不同的属性来满足不同的需求。
同时,注解形式还提供了一些方便的功能,如线程池的配置和任务的取消。
SpringBoot三种定时任务实现方式

SpringBoot三种定时任务实现方式在Spring Boot项目中,实现定时任务是常见需求。
Spring Boot提供了多种灵活的方式来实现定时任务,包括基于注解的方式、基于接口的方式以及使用外部任务调度工具等。
定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时刻执行某些动作...定时任务在主流开发语言均提供相应的API供开发者调用,在Java中,实现定时任务有很多种方式,原生的方式实现一个完整定时任务需要由Timer、TimerTask两个类,Timer 是定时器类,用来按计划开启后台线程执行指定任务,TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
除此之外,还可以用ScheduledExecutorService类或者使用第三方jar库Quartz,其中Quartz是一个优秀的定时任务框架,发展至今已经非常成熟,以致后来其他的定时任务框架的核心思想或底层大多源于Quartz。
springboot作为Java的一种开发框架,在springboot项目中实现定时任务不仅可以使用Java提供的原生方式,还可以使用springboot提供的定时任务API。
本文将详细介绍三种常用的Spring Boot定时任务实现方式,并提供相应的例子代码。
1. 基于注解的方式(@Scheduled)使用@Scheduled注解是实现Spring Boot定时任务最简单直接的方式。
首先,你需要在Spring Boot的启动类或者配置类上添加@EnableScheduling注解来启用定时任务支持。
然后,在需要定时执行的方法上添加@Scheduled注解,并指定cron表达式或固定间隔。
例子代码:在上面的代码中,@Scheduled注解分别使用了cron表达式和固定频率(fixedRate)两种方式来定义定时任务。
需要注意的是,@EnableScheduling 注解只需要在Spring Boot的启动类或配置类上添加一次。
spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法

spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的⽅法串⾏的定时任务@Componentpublic class ScheduledTimer {private Logger logger = Logger.getLogger(this.getClass());/*** 定时任务,1分钟执⾏1次,更新潜在客户超时客户共享状态*/@Scheduled(cron="0 0/1 8-20 * * ?")public void executeUpdateCuTask() {Thread current = Thread.currentThread();(" 定时任务1:"+current.getId()+ ",name:"+current.getName());}@Scheduled(cron="0 0/1 8-20 * * ?")public void executeGetRepayTask() {Thread current = Thread.currentThread();(" 定时任务2:"+current.getId()+ ",name:"+current.getName());}}并⾏的定时任务需要添加配置⽂件因为spring-boot的⽬的就是⼲掉配置⽂件,我在⽹上看到的很多都是通过配置⽂件来实现的,这⾥通过代码配置实现:@Configurationpublic class ScheduleConfig implements SchedulingConfigurer{@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar){TaskScheduler taskScheduler = taskScheduler();taskRegistrar.setTaskScheduler(taskScheduler);}@Bean(destroyMethod = "shutdown")public ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(20);scheduler.setThreadNamePrefix("task-");scheduler.setAwaitTerminationSeconds(60);scheduler.setWaitForTasksToCompleteOnShutdown(true);return scheduler;}}⽹上教程说的需要在启动类上加上@EnableScheduling注解来发现注解@Scheduled的任务并后台执⾏。
详解SpringBoot创建定时任务(配合数据库动态执行)

详解SpringBoot创建定时任务(配合数据库动态执⾏)序⾔:创建定时任务⾮常简单,主要有两种创建⽅式:⼀、基于注解(@Scheduled) ⼆、基于接⼝(SchedulingConfigurer).前者相信⼤家都很熟悉,但是实际使⽤中我们往往想从数据库中读取指定时间来动态执⾏定时任务,这时候基于接⼝的定时任务就⼤派⽤场了。
⼀、静态定时任务(基于注解)基于注解来创建定时任务⾮常简单,只需⼏⾏代码便可完成。
@Scheduled 除了⽀持灵活的参数表达式cron之外,还⽀持简单的延时操作,例如 fixedDelay ,fixedRate 填写相应的毫秒数即可。
@Configuration //1.主要⽤于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务public class SimpleScheduleConfig {//3.添加定时任务@Scheduled(cron = "0/5 * * * * ?")private void configureTasks() {System.err.println("执⾏定时任务1: " + LocalDateTime.now());}}Cron表达式参数分别表⽰:秒(0~59)例如0/5表⽰每5秒分(0~59)时(0~23)⽉的某天(0~31)需计算⽉(0~11)周⼏(可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)启动应⽤,可以看到控制台的信息如下:诚然,使⽤Scheduled 确实很⽅便,但缺点是当我们调整了执⾏周期的时候,需要重启应⽤才能⽣效,这多少有些不⽅便。
为了达到实时⽣效的效果,可以使⽤接⼝来完成定时任务。
⼆、动态定时任务(基于接⼝)为了演⽰效果,这⾥选⽤ Mysql数据库和 Mybatis 来查询和调整定时任务的执⾏周期,然后观察定时任务的执⾏情况。
SpringBoot中定时任务的3种实现方式

SpringBoot中定时任务的3种实现⽅式Ref定时任务的实现⽅式⽅式1:基于java.util.Timer定时器,实现类似闹钟的定时任务⽅式2:使⽤ Quartz、elastic-job、xxl-job 等开源第三⽅定时任务框架,适合分布式项⽬应⽤。
该⽅式的缺点是配置复杂。
⽅式3:使⽤ Spring 提供的⼀个注解@Schedule,开发简单,使⽤⽐较⽅便。
java.util.Timer实现定时任务基于java.util.Timer定时器,实现类似闹钟的定时任务。
这种⽅式在项⽬中使⽤较少,参考如下Demo。
import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class SpringbootAppApplication {/*** main⽅法* @param args*/public static void main(String[] args) {SpringApplication.run(SpringbootAppApplication.class, args);System.out.println("Server is running ...");TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.println("task run:"+ new Date());}};Timer timer = new Timer();timer.schedule(timerTask,10,3000);}}复制代码ScheduledExecutorService实现定时任务该⽅法类似Timer,参考如下Demo。
public class TestScheduledExecutorService {public static void main(String[] args) {ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();/*** @param command the task to execute 任务体* @param initialDelay the time to delay first execution ⾸次执⾏的延时时间* @param period the period between successive executions 任务执⾏间隔* @param unit the time unit of the initialDelay and period parameters 间隔时间单位*/service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);}}复制代码@Schedule实现定时任务Demo1. ⾸先,在项⽬启动类上添加@EnableScheduling注解,开启对定时任务的⽀持。
SpringBoot中使用@Scheduled注解创建定时任务的实现

SpringBoot中使⽤@Scheduled注解创建定时任务的实现在项⽬⽇常开发过程中,经常需要定时任务来帮我们做⼀些⼯作,如清理⽇志。
定时任务的实现⽅法主要有 Timer、Quartz 以及 elastic-jobTimer 实现定时任务只执⾏⼀次的定时任务Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("2000毫⽶后执⾏⼀次。
");}}, 2000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("5000毫⽶后执⾏⼀次。
");}}, new Date(System.currentTimeMillis() + 5000));循环执⾏任务Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(111);}}, 1000, 2000); // 1000毫⽶后执⾏第⼀次,之后每2000毫⽶执⾏⼀次终⽌任务timer.concel();Timer 是 JDK 实现的定时任务,⽤起来简单、⽅便,对⼀些简单的定时任务可以使⽤它。
由于它不⽀持 cron 表达式,现在已经很少⽤了。
Quartz 实现定时任务Quartz 是⼀个完全由 Java 编写的开源作业调度框架,可以⽤它来实现定时任务。
在 pom.xml ⽂件添加 Quartz 依赖<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.6</version></dependency>编写 Job定时执⾏的任务public class QuartzJob implements Job{public void execute(JobExecutionContext context) throws JobExecutionException {JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();String hello = (String) jobDataMap.get("hello");System.err.println(hello);}}编写 Taskpublic void task() {// 该 map 可在 job 中获取JobDataMap map = new JobDataMap();map.put("hello", "world");JobDetail jobDetail = newJob(QuartzJob.class).withIdentity("myJob", "myGroup").setJobData(map).build();/** 简单定时器** 执⾏时间间隔* withIntervalInMilliSeconds 毫秒* withIntervalInSeconds 秒* withIntervalInMinutes 分钟* withIntervalInHours ⼩时** 执⾏次数* repeatForever 重复执⾏* withRepeatCount 次数*/SimpleScheduleBuilder scheduleBuilder = simpleSchedule().withIntervalInSeconds(3).withRepeatCount(10);/** corn定时器** corn表达式,使⽤更灵活* corn表达式在线⽣成 /*/CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 0 0 1 * ?");Trigger trigger = newTrigger().startAt(new Date()).//startNow() 默认现在开始withIdentity("myTrigger", "myGroup").//withSchedule(scheduleBuilder).build();withSchedule(cronScheduleBuilder).build();try {//1.创建Scheduler⼯⼚SchedulerFactory schedulerFactory = new StdSchedulerFactory();//2.获取实例Scheduler scheduler = schedulerFactory.getScheduler();//3.设置jobDetail详情和trigger触发器scheduler.scheduleJob(jobDetail, trigger);//4.定时任务开始scheduler.start();} catch (SchedulerException e) {e.printStackTrace();}}在项⽬启动的时候调⽤ task ⽅法即可启动定时任务。
springboot系列之八:SpringBoot处理定时任务

springboot系列之⼋:SpringBoot处理定时任务项⽬经常会⽤到定时任务,springboot⾃然是可以通过整合相关组件来实现的。
⽬前常⽤的定时任务的实现有两种:1. 通过spring ⾃带的定时器任务@Schedule来实现2. 通过Quartz来实现本次借⽤上⼀篇的既有项⽬结构进⾏案例调试。
⼀、cron表达式⽆论上⾯说的哪种实现⽅式,都需要⽤到cron表达式,因此不得不先介绍下它。
Cron表达式是⼀个字符串,由6或7个域组成,每个域有不同的含义,每个域之间⽤空格隔开。
有2中格式:Seconds Minutes Hours DayofMonth Month DayofWeek Year (7个域)Seconds Minutes Hours DayofMonth Month DayofWeek (6个域)每个域可能出现的值:Seconds:有效范围为0-59的整数Minutes:有效范围为0-59的整数Hours:有效范围为0-23的整数DayofMonth:有效范围为0-31的整数Month:有效范围为1-12的整数或JAN-DECDayofWeek:有效范围为1-7的整数或SUN-SAT两个范围。
1表⽰星期天,2表⽰星期⼀,依次类推Year:有效范围为1970-2099年除了以上内容外,还可能出现⼀些特殊字符:(1)*:表⽰匹配该域的任意值,假如在Minutes域使⽤*, 即表⽰每分钟都会触发事件。
(2)?:只能⽤在DayofMonth和DayofWeek两个域。
它也匹配域的任意值,但实际不会。
因为DayofMonth和DayofWeek会相互影响。
例如想在每⽉的10⽇触发调度,不管10⽇到底是星期⼏,则只能使⽤如下写法: 13 13 15 10 * ?, 其中最后⼀位只能⽤(3)-:表⽰范围,例如在Minutes域使⽤5-20,表⽰从5分到20分钟每分钟触发⼀次(4)/:表⽰起始时间开始触发,然后每隔固定时间触发⼀次,例如在Minutes域使⽤5/20,则意味着5分钟触发⼀次,⽽25,45等分别触发⼀次.(5),:表⽰列出枚举值值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SpringBoot 定时任务@Scheduled实现定时任务
在启动项中加入@EnableScheduling
在定时任务中加入@Component交于Spring管理
使用@Scheduled(fixedDelay = 5000) 5秒跑一次任务
支持支持cron表达式
按顺序依次为
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)
其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。
由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为“MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
“*”字符代表所有可能的值
因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天
“/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样。