spring boot(学习笔记第十八课)
- Spring boot的定时任务和Quartz
学习内容:
- Spring boot的定时任务
- Spring boot的Quartz
1. Spring boot的定时任务
- 定义定时任务
-
加入必要的依赖
xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
在主类里面让
scheduling
生效java@SpringBootApplication @EnableScheduling public class DemoApplication {
-
定义
component
,测试scheduling task
java@Component public class ScheduledJob { @Scheduled(fixedDelay = 1000) public void fixedDelay() { System.out.println("fixedDelay(1000ms):" + new Date()); } @Scheduled(fixedRate = 2000) public void fixRate() { System.out.println("fixedRate(2000):" + new Date()); } @Scheduled(initialDelay = 1000, fixedRate = 2000) public void initialDelay() { System.out.println("initialDelay(1000),fixedRate(2000):" + new Date()); } @Scheduled(cron = "0 * * * * ?") public void cron() { System.out.println("cron(0 * * * * ?):" + new Date()); } }
-
测试
sheduled component
效果
-
cron
表达式Cron表达式是一种时间表达式,用于指定定时任务的时间、频率和间隔。它由6到7个字段组成,分别表示秒、分、时、日期、月份、星期和年份(可选)。Cron表达式的基本语法如下: 秒(0-59) 分(0-59) 时(0-23) 日期(1-31) 月份(1-12或JAN-DEC) 星期(0-7或SUN-SAT,其中0和7都表示周日) 年份(可选,1970-2099) Cron表达式的字段之间用空格分隔,每个字段可以有特定的值、范围、通配符等来表示不同的时间模式。例如,*表示匹配所有可能的值,?用于日期和星期字段中的一个,表示不指定值,/用于指定数值的增量,如*/5表示每隔5个单位,-用于表示范围,如5-20表示从5到20的所有值。 Cron表达式的高级用法包括使用通配符、时间增量以及将多个表达式组合在一起,以指定更复杂的时间表。例如,0 8-12,14-18 * * *表示每天的8:00到12:00和14:00到18:00之间执行任务。 Cron表达式的应用广泛,包括在各种定时任务、日志清理、系统维护、数据备份等场景中使用,通过设置Cron表达式,可以自动化执行这些任务,提高系统效率和可靠性
-
2. Spring boot的Quartz
-
Spring boot Quatz
它是一个spring boot
的一个作业调度的框架,创建简单和复杂调度作业。
主要提供三种bean
JobDetail
Trigger
Scheduler
接下来练习如果使用这三种bean
来进行作业调度作业。
-
练习使用
spring boot quartz
-
加入必要的依赖
xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
-
定义
jobDetail
的两个bean
注意第一个是bean
,第二个就是单纯的java class
java@Component("MyFirstJob") public class MyFirstJob { public void sayHello(){ System.out.println("MyFirstJob:" + new Date()); } }
第二个是单纯的
java class
java@Data public class MySecondJob extends QuartzJobBean { private String name; @Override protected void executeInternal(JobExecutionContext context){ System.out.println("hello:" + name + new Date()); } }
-
将两个
jobBean
进一步包装成jobDetail
,并以bean
的形式进行configuration
java@Configuration public class QuartzJobDetailConfig { @Bean("jobDetail1") public MethodInvokingJobDetailFactoryBean jobDetail1() { MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean(); bean.setTargetBeanName("MyFirstJob"); bean.setTargetMethod("sayHello"); return bean; } @Bean("jobDetail2") JobDetailFactoryBean jobDetail2() { JobDetailFactoryBean bean = new JobDetailFactoryBean(); bean.setJobClass(MySecondJob.class); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("name", "finlay"); bean.setJobDataMap(jobDataMap); return bean; } }
至此,已经定义了两个
jobDetail
的bean
,分别是jobDetail1
和jobDetail2
。 -
接下来,定义
Trigger
的bean
以及开启Scheduler
,对Trigger
进行调度。java@Configuration public class QuartzConfig { @Autowired @Qualifier("jobDetail1") public MethodInvokingJobDetailFactoryBean _jobDetail1; @Autowired @Qualifier("jobDetail2") public JobDetailFactoryBean _jobDetail2; @Bean() SimpleTriggerFactoryBean simpleTriggerFactoryBean() { SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean(); bean.setJobDetail(_jobDetail1.getObject()); bean.setRepeatCount(3); bean.setStartDelay(1000); bean.setRepeatInterval(2000); return bean; } @Bean CronTriggerFactoryBean cronTriggerFactoryBean() { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); bean.setJobDetail(_jobDetail2.getObject()); bean.setCronExpression("* * * * * ?"); return bean; } @Bean SchedulerFactoryBean schedulerFactoryBean(){ SchedulerFactoryBean bean = new SchedulerFactoryBean(); SimpleTrigger simpleTrigger = simpleTriggerFactoryBean().getObject(); CronTrigger cronTrigger = cronTriggerFactoryBean().getObject(); bean.setTriggers(simpleTrigger,cronTrigger); return bean; } }
-
-
启动上面的
spring boot quartz