1、导入依赖
<properties>
<springframework.version>5.1.6.RELEASE</springframework.version>
<quartz.version>2.2.3</quartz.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<!--quartz 定时器-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
</dependencies>
2、编写配置
定义任务:
方式一(推荐):MethodInvokingJobDetailFactoryBean
<!--quartz定时器 组合-->
<bean id="MyJobDetail" class="com.zzc.job.JobMethodInvoke"/>
<!--任务 job-->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 指定job的名称 -->
<property name="name" value="job1"/>
<!-- 指定job的分组 -->
<property name="group" value="job_group1"/>
<!--目标任务类-->
<property name="targetBeanName" value="jobMethodInvoke"/>
<!--具体目标方法-->
<property name="targetMethod" value="doJob"/>
</bean>
方式二:JobDetailFactoryBean
<!--任务 job-->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 指定job的名称 -->
<property name="name" value="job1"/>
<!-- 指定job的分组 -->
<property name="group" value="job_group1"/>
<!-- 指定具体的job类 -->
<property name="jobClass" value="com.zzc.job.MyJob"/>
</bean>
要在调度器中手动注册service:
<!-- 3.定义调度器,并将Trigger注册到调度器中 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="schedulerContextAsMap">
<map>
<!-- spring 管理的service需要放到这里,才能够注入成功 -->
<description>schedulerContextAsMap</description>
<entry key="userService" value-ref="userService"/>
</map>
</property>
<!-- 添加 quartz 配置,-->
<property name="configLocation" value="classpath:quartz.properties"></property>
<!--将Trigger注册到调度器中-->
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
配置触发器
<!-- 2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 指定Trigger的名称 -->
<property name="name" value="trigger1"/>
<!-- 指定Trigger的名称 -->
<property name="group" value="trigger_group1"/>
<!-- 指定Trigger绑定的JobDetail -->
<property name="jobDetail" ref="jobDetail"/>
<!-- 指定Cron 的表达式 ,当前是每隔5s运行一次 -->
<property name="cronExpression" value="*/5 * * * * ?" />
</bean>
配置调度器:
<!-- 3.定义调度器,并将Trigger注册到调度器中 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 添加 quartz 配置,-->
<property name="configLocation" value="classpath:quartz.properties"></property>
<!--将Trigger注册到调度器中-->
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
3、编写任务类
方式一(推荐)
直接编写自定义的任务类即可(对应上面定义任务的方式一)
JobMethodInvoke.java:
package com.zzc.job;
import com.zzc.pojo.User;
import com.zzc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
* @author zhouzhicheng
* @version 1.0 2020/12/28
*/
@Component
public class JobMethodInvoke {
@Autowired
private UserService userService;
public JobMethodInvoke() {
System.out.println("job初始化...");
}
public void doJob(){
System.out.println("==============");
System.out.println("执行任务: time"+new Date());
List<User> allUser = userService.getAllUser();
for (User user : allUser) {
System.out.println(user);
}
System.out.println("==============");
}
}
方式二
继承org.springframework.scheduling.quartz.QuartzJobBean编写任务类:
JobMethodInvoke.java:
package com.zzc.job;
import com.zzc.pojo.User;
import com.zzc.service.UserService;
import lombok.SneakyThrows;
import org.quartz.*;
import org.quartz.Job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
* @author zhouzhicheng
* @version 1.0 2020/12/28
*/
@Component
public class MyJob extends QuartzJobBean {
public MyJob() {
super();
System.out.println("JOB初始化");
}
@SneakyThrows
@Override
protected void executeInternal(JobExecutionContext context) {
//获取JobExecutionContext中的service对象
SchedulerContext schedulerContext = context.getScheduler().getContext();
//这里的service就是通过配置文件 配置的
UserService userService = (UserService) schedulerContext.get("userService");
System.out.println("执行任务: time"+new Date());
List<User> allUser = userService.getAllUser();
for (User user : allUser) {
System.out.println(user);
}
}
}
4、测试
package com.zzc.job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.impl.StdScheduler;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author zhouzhicheng
* @version 1.0 2020/12/28
*/
public class SpringQuartzTest {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("=============");
StdScheduler scheduler = (StdScheduler) app.getBean("scheduler");
System.out.println(scheduler.getClass());
// 暂停,恢复工作
scheduler.pauseJob(JobKey.jobKey("job1","job_group1"));// 暂停工作
Thread.sleep(3000);
scheduler.resumeJob(JobKey.jobKey("job1","job_group1"));// 恢复工作
}
}
注意:spring配置中定义任务的方式不同–>创建任务类的方式要相对应!!!