spring整合quartz
spring整合quartz网上有很多demo,大概说一下,因为springboot整合quartz在此基础上整改的
第一步,加入相关依赖
4.3.7.RELEASE
2.2.2
org.springframework
spring-core
${springframework.version}
org.springframework
spring-context-support
${springframework.version}
org.springframework
spring-tx
${springframework.version}
org.quartz-scheduler
quartz
${quartz.version}
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.8
第二步,配置quartz的Scheduler(调度器)
有二种方式使用spring的quartz的job去配置Job(任务)
第一种是使用MethodInvokingJobDetailFactoryBean,配置如下:
第二种是使用JobDetailFactoryBean,第二种方式可以传递额外的参数给定时job
jobClass是一个扩展QuartzJobBean的类,它是一个Quartz作业接口的实现。 在调用这个工作时,它被executeInternal方法调用。jobDataMap提供了将一些数据传递给基础作业bean的机会。 在这种情况下,我们传递一个将由ScheduledJob使用的bean“anotherBean”。
其实现如下:
public class ScheduledJob extends QuartzJobBean {
private AnotherBean anotherBean;
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
anotherBean.printAnotherMessage();
}
public void setAnotherBean(AnotherBean anotherBean) {
this.anotherBean = anotherBean;
}
}
第三步,配置Quartz Scheduler的Triggers(触发器)
- 普通的触发器,使用SimpleTriggerFactoryBean
- Cron触发器,使用CronTriggerFactoryBean
第四步,配置SchedulerFactoryBean
完整的配置:
第五步,一些任务有关的实体类
@Component("myBean")
public class MyBean {
public void printMessage() {
System.out.println("I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean");
}
}
@Component("anotherBean")
public class AnotherBean {
public void printAnotherMessage(){
System.out.println("I am called by Quartz jobBean using CronTriggerFactoryBean");
}
}
public class ScheduledJob extends QuartzJobBean {
private AnotherBean anotherBean;
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
anotherBean.printAnotherMessage();
}
public void setAnotherBean(AnotherBean anotherBean) {
this.anotherBean = anotherBean;
}
}
第六步,启动类:
public class AppMain {
public static void main(String args[]){
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring-common.xml");
}
}
打印结果
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
....
springboot整合quart
上面的示列是我们进行springboot与quartz整合的参考。
第一步加入依赖:
org.springframework.boot
spring-boot-starter-web
org.quartz-scheduler
quartz
2.2.3
org.springframework
spring-context-support
4.3.7.RELEASE
org.springframework
spring-tx
4.3.7.RELEASE
第二步,配置quartz的Scheduler(调度器)
二种方式使用spring的quartz的job去配置Job
第一种是使用MethodInvokingJobDetailFactoryBean,
@Bean("methodInvokingJobDetailFactoryBean")
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
bean.setTargetObject(jobBean);
bean.setTargetMethod("printMessage");
bean.setConcurrent(false);
return bean;
}
第二种是使用JobDetailFactoryBean,第二种方式可以传递额外的参数给定时job
public JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
jobDetailFactoryBean.setJobClass(scheduledJob.getClass());
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("jobCornBean",jobCornBean); //额外参数,对应上文的anotherbean
jobDetailFactoryBean.setJobDataMap(jobDataMap);
jobDetailFactoryBean.setDurability(true);
return jobDetailFactoryBean;
}
scheduledJob对应的代码和上面也是一样:
@Component
public class ScheduledJob extends QuartzJobBean {
private JobCornBean jobCornBean;
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
jobCornBean.printAnotherMessage();
}
public void setJobCornBean(JobCornBean jobCornBean) {
this.jobCornBean = jobCornBean;
}
}
第三步,配置Quartz Scheduler的Triggers(触发器)
- 普通的触发器,使用SimpleTriggerFactoryBean
@Bean("simpleTriggerFactoryBean")
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean){
SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
simpleTriggerFactoryBean.setJobDetail(methodInvokingJobDetailFactoryBean.getObject());
simpleTriggerFactoryBean.setStartDelay(1000);
simpleTriggerFactoryBean.setRepeatInterval(2000);
return simpleTriggerFactoryBean;
}
- Cron触发器,使用CronTriggerFactoryBean
@Bean("cronTriggerFactoryBean")
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
cronTriggerFactoryBean.setCronExpression("0/1 * * ? * *");
return cronTriggerFactoryBean;
}
第四步,配置SchedulerFactoryBean
自己将上面的jobDetails和triggers都配置到一个类中,这样便于后续定时任务的添加
@Bean("jobConfigBean")
public JobConfigBean jobConfigBean(){
JobConfigBean jobConfigBean = new JobConfigBean();
List jobDetails = new ArrayList<>();
jobDetails.add(methodInvokingJobDetailFactoryBean().getObject());
jobDetails.add(jobDetailFactoryBean().getObject());
JobDetail[] jobDetailarr = createJobDetail(jobDetails);
List triggers = new ArrayList<>();
triggers.add(simpleTriggerFactoryBean(methodInvokingJobDetailFactoryBean()).getObject());
triggers.add(cronTriggerFactoryBean(jobDetailFactoryBean()).getObject());
Trigger[] triggerarr = createTriggers(triggers);
jobConfigBean.setJobDetails(jobDetailarr);
jobConfigBean.setTriggers(triggerarr);
return jobConfigBean;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(JobConfigBean jobConfigBean){
//一个定时任务
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobDetails(jobConfigBean.getJobDetails());
schedulerFactoryBean.setTriggers(jobConfigBean.getTriggers());
return schedulerFactoryBean;
}
JobConfigBean的定义如下:
public class JobConfigBean {
private JobDetail[] jobDetails;
private Trigger[] triggers;
public JobDetail[] getJobDetails() {
return jobDetails;
}
public void setJobDetails(JobDetail[] jobDetails) {
this.jobDetails = jobDetails;
}
public Trigger[] getTriggers() {
return triggers;
}
public void setTriggers(Trigger[] triggers) {
this.triggers = triggers;
}
}
启动类:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
打印结果:
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
I am called by Quartz jobBean using CronTriggerFactoryBean
关于详细的代码可以查看博客下方的代码链接。
springboot Scheduler
springboot定时任务
参考资料
Spring 4 + Quartz Scheduler Integration Example
Spring 4.2.2 集成 Quartz Scheduler 2.2.2 任务调度示例
代码地址
spring-quartz
springboot-quartz