一、Quartz
通过main方法调用最基础的quartz:
首先取Quartz官网下载jar包,我用的是2.2.3版本的:点击打开链接 ,需要创建俩个类
public class RAMJob implements Job{
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("Say hello to Quartz" + new Date());
}
}
public class TestTask{
public static void main(String[] args) throws SchedulerException {
//1.创建Scheduler的工厂
SchedulerFactory sf = new StdSchedulerFactory();
//2.从工厂中获取调度器实例
Scheduler scheduler = sf.getScheduler();
//3.创建JobDetail
JobDetail jobDetail=JobBuilder.newJob(RAMJob.class).withIdentity("ramJob", "ramGroup").build();
//4.创建触发器
Trigger trigger =
TriggerBuilder.newTrigger()
.withIdentity("ramTrigger", "ramTriggerGroup")// 触发器名,触发器组
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))// 触发器时间设定
.build();// 创建Trigger对象
//5.注册任务和定时器
scheduler.scheduleJob(jobDetail, trigger);
//6.启动 调度器
scheduler.start();
System.out.println("启动时间 : " + new Date());
}
}
2.但自动任务用到实际web环境时我们就要求他可以随tomcat一起启动(也可以说时随spring一起启动),所以我们要做的时把以上的信息写道xml文件中并通过web.xml调用,需要注意的是quartz2.x以上版本需要spring3.1以上版本才可以(一把心酸泪)
web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/quartz.xml</param-value>
</context-param>
quartz.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:property-placeholder location="classpath:info.properties"/>
<!--
Spring整合Quartz进行配置遵循下面的步骤:
1:定义工作任务的Job
2:定义触发器Trigger,并将触发器与工作任务绑定
3:定义调度器,并将Trigger注册到Scheduler
-->
<bean id="Job" class="cn.com.xxx.RAMJob" />
<!-- 1:定义任务的bean ,这里使用JobDetailFactoryBean,也可以使用MethodInvokingJobDetailFactoryBean ,JobDetailFactoryBean配置类似-->
<bean name="JobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 指定job的名称 -->
<property name="name" value="Job"/>
<!-- 指定job的分组 -->
<property name="group" value="Group"/>
<!-- 指定具体的job类 -->
<property name="targetObject" ref="Job"/>
<!-- 指定具体的方法 -->
<property name="targetMethod" value="execute"/>
<!-- 不要并发执行 -->
<property name="concurrent" value="false" />
</bean>
<!-- 2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 指定Trigger的名称 -->
<property name="name" value="Trigger"/>
<!-- 指定Trigger的名称 -->
<property name="group" value="TriggerGroup"/>
<!-- 指定Tirgger绑定的Job -->
<property name="jobDetail" ref="JobDetail"/>
<!-- 指定Cron 的表达式 ,当前是每隔1s运行一次 -->
<property name="cronExpression" value="${cron}"/> 《可以看到我使用了一个配置文件我用来动态获取properties中cron的值
</bean>
<!-- 3.定义调度器,并将Trigger注册到调度器中 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
<property name="autoStartup" value="true" /><!--自动启动-->
</bean>
</beans>
info.properties:
cron=0/2 * * * * ?
MethodInvokingJobDetailFactoryBean这个类可以设置是否允许并发执行,tragetMethod用于指定需要自动执行的方法名,
但不能用我第一点说的RAMJob 类了,因为execute方法有参数,而这个并不能或着我不知道怎么设参数(网上找了也没有,欢迎大家后续补充)所以需要改RAMJob 代码:
public class RAMJob{
@Override
public void execute() {
System.out.println("Say hello to Quartz" + new Date());
}
}
然后启动tomcat就发现任务自动开始执行啦。
二、SpringBoot整合Quartz
引入依赖
<!-- SpringBoot 整合 Quartz 定时任务 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
编写任务类
public class TaskJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("自动任务执行中...");
}
}
编写配置类
@Configuration
public class QuartzConfig {
private static String JOB_GROUP_NAME="TASK_GROUP";
private static String TRIGGER_GROUP_NAME="TRIGGER_GROUP";
@Bean
public JobDetail testJobDetail(){
JobDetail jobDetail= JobBuilder.newJob(TaskJob.class)
.withIdentity("testJobDetail",JOB_GROUP_NAME)
.storeDurably()
.build();
return jobDetail;
}
@Bean
public Trigger taskJobTrigger(){
CronScheduleBuilder scheduleBuilder=CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
Trigger trigger= TriggerBuilder.newTrigger()
.forJob(testJobDetail())
.withIdentity("taskJobTrigger",TRIGGER_GROUP_NAME)
.withSchedule(scheduleBuilder)
.build();
return trigger;
}
}
运行项目后
使用数据库保存配置信息
Quzrtz存储任务信息有两种方式,使用内存或者使用数据库来存储
采用mysql数据库存储方式,首先到官网下载quartz包(Downloads),然后在docs下找到tables_mysql.sql进行创建,此时数据库会多出11张表