Quartz是OpenSymphony开源组织在Job scheduling领域的有一个开源项目,是一个任务管理系统,可以与J2EE、J2SE应用程序结合,也可以单独使用,Quartz不仅可以用来创建简单的定时程序,还可以创建可运行成百上千甚至上万个Job的复杂定时程序。
Quartz框架的核心对象如下:
直接上代码:
方法一:
1、引入依赖包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、自定义任务类:
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
/**
* @Description:
* @Author devin.jiang
* @CreateDate 2019/5/19 20:22
*/
@Configuration
@Component
@EnableScheduling
public class HelloTask {
public void sayHello() {
System.out.println("hello word");
}
}
3、配置类
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.*;
/**
* @Description: 配置Quartz的Scheduler调度器
* @Author devin.jiang
* @CreateDate 2019/5/19 20:10
*/
@Configuration
public class QuartzConfigure {
/**
* 使用MethodInvokingJobDetailFactoryBean进行配置,自定义任务不需要实现Job接口
* @param helloTask
* @return
*/
@Bean(name = "jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(HelloTask helloTask) {
MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
//是否并发执行
jobDetailFactoryBean.setConcurrent(false);
//设置需要执行的实体类对应的对象
jobDetailFactoryBean.setTargetObject(helloTask);
//设置需要执行的方法
jobDetailFactoryBean.setTargetMethod("sayHello");
return jobDetailFactoryBean;
}
/**
* 配置储发器
* @param jobDetailFactoryBean
* @return
*/
@Bean(name = "cronJobTrigger")
public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetailFactoryBean) {
CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
triggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
//设置cron表达式,10秒钟执行一次
triggerFactoryBean.setCronExpression("*/10 * * * * ?");
return triggerFactoryBean;
}
/**
* 配置Scheduler
* @param cronJobTrigger
* @return
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactoryBean(Trigger cronJobTrigger) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
//用于Quartz集群,QuartzScheduler启动时会更新已存在的Job
schedulerFactoryBean.setOverwriteExistingJobs(true);
//延时启动,应用启动1秒后
schedulerFactoryBean.setStartupDelay(1);
//注册触发器
schedulerFactoryBean.setTriggers(cronJobTrigger);
return schedulerFactoryBean;
}
}
4、运行截图:
方法二:
1、引入依赖包,如方法一第一步
2、自定义任务类:
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
/**
* @Description: 自定义任务类,通过注解实现
* @Author devin.jiang
* @CreateDate 2019/5/19 20:08
*/
@Component
public class HelloJob implements Job {
private String name;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap jdm = jobExecutionContext.getJobDetail().getJobDataMap();
name = jdm.getString("name");
System.out.println("hello: " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、配置类:
import org.quartz.JobDataMap;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.*;
/**
* @Description: 配置Quartz的Scheduler调度器
* @Author devin.jiang
* @CreateDate 2019/5/19 20:10
*/
@Configuration
public class QuartzJobConfigure {
/**
* 使用JobDetailFactoryBean进行配置,自定义任务需要实现Job接口
* @param helloJob
* @return
*/
@Bean("jobDetail")
public JobDetailFactoryBean jobDetailFactoryBean(HelloJob helloJob) {
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
jobDetailFactoryBean.setJobClass(helloJob.getClass());
jobDetailFactoryBean.setDurability(true);
//额外参数
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("name","Quartz");
jobDetailFactoryBean.setJobDataMap(jobDataMap);
return jobDetailFactoryBean;
}
/**
* 普通的触发器,此处也可用Cron储发器实现
* @param jobDetail
* @return
*/
@Bean("simpleTrigger")
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetail) {
SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
simpleTriggerFactoryBean.setJobDetail(jobDetail.getObject());
simpleTriggerFactoryBean.setStartDelay(0);
simpleTriggerFactoryBean.setRepeatInterval(1000);
return simpleTriggerFactoryBean;
}
/**
* 配置调度容器
* @param simpleTrigger
* @return
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactoryBean(Trigger simpleTrigger) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
//用于Quartz集群,QuartzScheduler启动时会更新已存在的Job
schedulerFactoryBean.setOverwriteExistingJobs(true);
//延时启动,应用启动1秒后
schedulerFactoryBean.setStartupDelay(1);
//注册触发器
schedulerFactoryBean.setTriggers(simpleTrigger);
return schedulerFactoryBean;
}
}
4、运行截图:
代码git地址:https://github.com/380682174/springBootBuket.git
参考:《可伸缩服务架构》