您的位置:首页 > 编程语言 > Java开发

Spring boot下 Quartz 详细应用配置

2017-07-18 14:25 232 查看

1. 首先是pom.xml文件

<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>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>


2.  覆盖SpringBeanJobFactory中的createJobInstance(), 对其创建出来的类自动注入

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.stereotype.Component;

@Component
public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {

private transient AutowireCapableBeanFactory beanFactory;

@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);

return job;
}

@Override
public void setApplicationContext(final ApplicationContext context) {
beanFactory = context.getAutowireCapableBeanFactory();
}

}

3. 定义configuration并暴露bean给spring IOC

import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class SchedulerConfiguration {

@Autowired
private ApplicationContext applicationContext;

@Autowired
private AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory;

@Bean
public SchedulerFactoryBean getSchedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
autowiringSpringBeanJobFactory.setApplicationContext(applicationContext);
schedulerFactoryBean.setJobFactory(autowiringSpringBeanJobFactory);
return schedulerFactoryBean;
}

@Bean
public Scheduler scheduler() {
return getSchedulerFactoryBean().getScheduler();
}
}
@Configuration
is a class-level annotation indicatingthat an object is a source of bean definitions.
@Configuration
classes declare beans via public
@Bean
annotated methods.

The

@Bean
annotation is used to indicate that a method instantiates, configures and initializes a new object to be managed by the Spring IoC container

另外, 之所以使用ApplicationContext, 是因为开发时有遇到在Job中使用注解方式注入service层后报空指针异常. 原因是Quartz初始化的JobContext不同于Spring的ApplicationContext, 无法直接注入.


4.  创建ScheduleFactory, 用于管理维护Schedule, 个人封装了一些方法, 供给service调用

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import com.maiscrm.weibo.model.JobAndTrigger;
import com.maiscrm.weibo.model.JobDetails;
import com.maiscrm.weibo.quartz.job.SampleJob;

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class ScheduleFactory {

@Autowired
private Scheduler scheduler;

private static final String DEFAULT_GROUP = "group_1";
private static final String DEFAULT_TRIGGER_PREFIX = "trigger_id_";

/**
* Add a job to schedule.
* @param job
* @return Return the detail of this job.
* @throws SchedulerException
*/
public JobAndTrigger addJob(JobDetails job) {
try {
JobDetail jobDetail = JobBuilder.newJob(SampleJob.class).withIdentity(job.getName(), DEFAULT_GROUP).build();
CronTrigger trigger = newTrigger().withIdentity(DEFAULT_TRIGGER_PREFIX + job.getId(), DEFAULT_GROUP)
.withSchedule(cronSchedule(job.getExecuteTrigger())).build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}

return getJobAndTrigger(job);
}

/**
* Updates a exist job with new cron expression.
* @param oldConfig
* @param newCron
* @return Return the detail of this job.
*/
public JobAndTrigger updateJob(JobAndTrigger oldConfig, JobDetails job) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(oldConfig.getTriggerName(), oldConfig.getTriggerGroup());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity(oldConfig.getTriggerName(), oldConfig.getTriggerGroup());
triggerBuilder.startNow();
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(job.getExecuteTrigger()));
trigger = (CronTrigger) triggerBuilder.build();
scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}

return getJobAndTrigger(job);
}

/**
* Removes job by job detail.
* @param oldConfig
*/
public void removeJob(JobAndTrigger oldConfig) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(oldConfig.getTriggerName(), oldConfig.getTriggerGroup());
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
scheduler.deleteJob(JobKey.jobKey(oldConfig.getJobName(), oldConfig.getJobGroupName()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
* Start all jobs.
*/
public void startAllJobs() {
try {
scheduler.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
* Shutdown all jobs.
*/
public void shutdownAllJobs() {
try {
if (!scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

private JobAndTrigger getJobAndTrigger(JobDetails job) {
JobAndTrigger jobAndTrigger = new JobAndTrigger();
jobAndTrigger.setCron(job.getExecuteTrigger());
jobAndTrigger.setJobName(job.getName());
jobAndTrigger.setJobGroupName(DEFAULT_GROUP);
jobAndTrigger.setTriggerName(DEFAULT_TRIGGER_PREFIX + job.getId());
jobAndTrigger.setTriggerGroup(DEFAULT_GROUP);

return jobAndTrigger;
}

}
其中JobAndTrigger是我定义的一个model, 用于存放job detail, 方便管理Job, 里面有5个属性, 在getJobAndTrigger()这个方法里面就能看到, 不贴代码了.

另外, JobDetails也是一个model类, 是数据库中查询的结果的模型.


因为是效率开发, 并没有对quartz有很深的理解, 如果存在问题, 希望各位指正.

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: