1.添加jar包
<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>
2.加入依赖(PrintWordsJob和JobFactory根据项目中的地址来确定)
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="cn.les.syyj.zbzs.jhgl.service.PrintWordsJob"></property>
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"></property>
<property name="startDelay" value="3000"></property>
<property name="repeatInterval" value="5000"></property>
<property name="repeatCount" value="1"></property>
</bean>
<bean id="jobFactory" class="cn.les.syyj.zbzs.jhgl.service.JobFactory"></bean>
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"></property>
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
3.写JobFactory类,为了将job注入spring
package cn.les.syyj.zbzs.jhgl.service;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
4.写工具类
package cn.les.syyj.zbzs.jhgl.service;
import cn.les.syyj.zbzs.jhgl.dao.JhglDao;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 创建Scheduler,执行jobs
*/
@Service("taskScheduler")
public class TaskScheduler {
public static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
/**
* 添加定时任务的方法
* 多个任务时jobName,jobGroupName,triggerName,triggerGroupname 传来的值要唯一,有意义即可,time为需要执行的时间
* 这里的time要求的格式是cron格式,如果需要转换的话搜索日期转化cron即可或 https://blog.csdn.net/u010046887/article/details/50818124?utm_source=blogxgwz3 这个网址
*/
public void doScheduler(string jobName,string jobGroupName,string triggerName,string triggerGroupname string time) throws SchedulerException, InterruptedException{
//创建调度器Scheduler
Scheduler scheduler = schedulerFactory.getScheduler();
//移除任务
scheduler.deleteJob(JobKey.jobKey(jobName));
// 创建jobDetail实例,绑定具体jobs(PrintWordsJob)
JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class).withIdentity(jobName,jobGroupName).build();
//移除触发器
scheduler.unscheduleJob(TriggerKey.triggerKey("triggerName","triggerGroupname");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupname)
.usingJobData(triggerName, "这是jobDetail1的trigger")
.startNow()//立即生效
.withSchedule(CronScheduleBuilder.cronSchedule(time))
.build();
//执行
scheduler.scheduleJob(jobDetail, cronTrigger);
System.out.println("--------scheduler start ! ------------");
scheduler.start();
}
/**
* 移除一个任务的方法
*/
public static void removeJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName){
try {
Scheduler sched = schedulerFactory.getScheduler();
sched.pauseTrigger(TriggerKey.triggerKey(triggerName,triggerGroupName));// 停止触发器
sched.unscheduleJob(TriggerKey.triggerKey(triggerName,triggerGroupName));// 移除触发器
sched.deleteJob(JobKey.jobKey(jobName,jobGroupName));// 删除任务
} catch (Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 修改一个定时任务的方法
*/
public static void modifyJobTime(String triggerName,String triggerGroupName, String time) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) {
CronTrigger ct = (CronTrigger) trigger;
// 修改时间
ct.setCronExpression(time);
// 重启触发器
sched.resumeTrigger(triggerName, triggerGroupName);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
/**
* 关闭所有定时任务
*/
public static void shutdownJobs() {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
if (!sched.isShutdown()) {
sched.shutdown();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
5.定时任务触发类,定时时间到了进入execute方法
package cn.les.syyj.zbzs.jhgl.service;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* 具体某个定时任务执行的逻辑
*/
@Service
public class PrintWordsJob implements Job {
@Autowired
private TaskScheduler taskScheduler;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
try {
//写逻辑代码的地方
//taskScheduler.doScheduler(...);//自己想调用什么地方的方法就调用什么地方方法
} catch (SchedulerException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
相关工具类的方法可以参考:https://blog.csdn.net/xu768840497/article/details/78689447