Quartz
- quartz是什么
- quartz的核心API
- 使用代码测试quartz(单机版)
- quartz的cron表示式
- 整合spring
一.quertz是什么?
官方网站:http://www.quertz-scheduler.org/
Quartz是一个功能丰富的开源作业调度框架,几乎可以与任何java应用集成,小到单 体应用,大到大型电子商务系统。
Quartz可以用来创建和执行成千上万的简单或复杂的调度任务;
Quartz的任务被定义为一组标准的java组件,几乎可以执行任何编程任务;
他可以定时发送邮件、短信通知等;也可以定时做数据同步;也可以去确定一些特殊的日期 如母亲节(每年五月的第二个星期天 可以运用他的cron表达式可以精确到那一天 并执行一些任务操作 )
二.Quertz的核心Api
- Job:Quartz任务需要实现的接口
- JobDetail:用户定义务实例
- JobBuilder:创建JobDetail
- Trigger:
- SimpleTrigger:可以定义任务每隔多久执行 执行多少次 什么时候开始 什么时候结束
- CronTrigger:使用Cron表达式可以定义任意的执行时间
- TriggerBuilder:用于创建Trigger
- TriggerKey:Trigger的唯一标识
- Scheduler:调度器,使用Trigger定义的调度规则去执行Job任务
- JobKey:任务的唯一标识
- JobExecutionContext:任务执行上下文,可以从使用它获取JobDetail、Trigger等
- JobDataMap:用于JobDetail和Trigger给任务传参
三.使用代码测试SimpleTrigger
大体框架 [ 三大要素(JobDetail、Trigger、Scheduler)]
3.1 引入maven依赖
<!-- 引入quertz依赖 2.3.0为目前最高版本-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
3.2 创建HelloJob任务:要实现Job接口
public class HelloJob {
//方法名自定义
public void execute(){
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(dateFormat.format(new Date())+"-Hello Spring");
}
}
3.3 创建JobDetail Trigger Scheculer 执行调度 测试SimpleTrigger
public class FirstMain {
public static void main(String[] args) throws SchedulerException {
//1.使用jobBuider创建JobDetail 反射创建
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
.withIdentity("hello","hello").build();
//2.使用TriggerBuilder创建Trigger
SimpleTrigger trigger=TriggerBuilder.newTrigger().withIdentity("hello","hello")
.startNow()//任务立即执行
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)//五秒执行一次
.repeatForever())//永远执行
.build();//调度规则
//3.使用StdSchedulerFactory 创建Scheduler
Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
3.4 创建JobDetail Trigger Scheculer 执行调度 测试CronTrigger
public class CronTest {
public static void main(String[] args) throws SchedulerException {
//1.创建jobDetail
//唯一表示
JobKey jobId=new JobKey("helo","hello");
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
.withIdentity(jobId).build();
//2.创建trigger
TriggerKey triggerKey =new TriggerKey("hello","hello");//唯一标志
CronTrigger trigger=TriggerBuilder.newTrigger()
.withIdentity(triggerKey)
.withSchedule(//表示每天的十点44分开始执行 每十秒钟执行一次
CronScheduleBuilder.cronSchedule("0/10 44 10 * * ?")
)
.build();
//3.创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
执行结果
四.Quertz中的cron表達式
- Quartz Cron表达式用于配置CronTrigger实例
- Quartz Cron表达式由7个子表达式组成,用于描述时间的各个细节,这些表达式用空格分隔
符号说明:
五. Quartz整合spring(xml版+注解版)
没整合spring,创建JobDetail、Trigger、Scheduler 整合Spring,还是需要创建JobDetail、Trigger和Scheduler 哈哈哈哈哈
运用一下工厂类来创建
- MethodInvokingJobDetailFactoryBean 创建JobDetail 好处:不用实现实现任何接口
- 要配置的属性:
name group
targetObject:任务类-不是Class对象,而是一个spring bean
targetMethod:要执行的方法
- CronTriggerFactoryBean 创建Trigger
- 要配置的属性:
name、group、jobDetail、cronExpression
3. SchedulerFactoryBean 创建Scheduler
5.1引入maven依赖
<!-- 引入quertz依赖 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<!-- spring-context-support 依赖spring-context 就spring-context就不用引入了 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
5.2 xml版Quertz整合spring (配置JobDetail、Trigger、Scheduler)
5.2.1 配置spring.xml
<!-- 配置任务类 -->
<bean id="helloJob" class="com.etoak.job.HelloJob"></bean>
<!-- methodInvokingJobDetailFactoryBean -->
<bean id="helloJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="name" value="hello"/>
<property name="group" value="hello" />
<property name="targetObject" ref="helloJob" />
<property name="targetMethod" value="execute"></property>
</bean>
<!-- CroTriggerFactoryBean -->
<bean id="helloTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="name" value="hello" />
<property name="group" value="hello" />
<property name="cronExpression" value="*/5 * * * * ?" />
<property name="jobDetail" ref="helloJobDetail" />
</bean>
<!-- SchedulerFactroyBean -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="helloTrigger" />
</list>
</property>
</bean>
5.2.2 配置任务类
public class HelloJob {
//方法名自定义 测试 随便打印一句话
public void execute(){
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(dateFormat.format(new Date())+"-Hello Spring");
}
}
5.2.3 测试
public class XmlQuertzMain {
public static void main(String[] args) {
//xml得方式的整合得quertz
new ClassPathXmlApplicationContext("spring.xml");
}
}
5.3 整合注解版的spring
5.3.1 引入依赖 见上方xml的maven依赖
5.3.2 配置注解版的Quertz容器
@Configuration
public class QuertzConfig {
//注册job任务
@Bean
public HelloJob helloJob() {
return new HelloJob();
}
//注册MethodTnvokingJobDetailFactoryBean
@Bean
public MethodInvokingJobDetailFactoryBean helloJobDetail() {
MethodInvokingJobDetailFactoryBean jobDetail=new MethodInvokingJobDetailFactoryBean();
jobDetail.setName("hello");
jobDetail.setGroup("hello");
jobDetail.setTargetObject(this.helloJob());
jobDetail.setTargetMethod("execute");
return jobDetail;
}
//注册CroTriggerFactoryBean
@Bean
public CronTriggerFactoryBean helloTrigger() {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setName("hello");
trigger.setGroup("hello");
trigger.setCronExpression("0/3 * * * * ?");
trigger.setJobDetail(this.helloJobDetail().getObject());
return trigger;
}
//注册SchedulerFactoryBean
@Bean
public SchedulerFactoryBean scheduler() {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setTriggers(this.helloTrigger().getObject());
return factory;
}
}
5.3.3 测试注解版
public class JavaConfig {
public static void main(String[] args) {
new AnnotationConfigApplicationContext(QuertzConfig.class);
}
}