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(); } }
@Configurationis a class-level annotation indicatingthat an object is a source of bean definitions.
@Configurationclasses declare beans via public
@Beanannotated methods.
The
@Beanannotation 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有很深的理解, 如果存在问题, 希望各位指正.
相关文章推荐
- springboot整合Quartz实现动态配置定时任务
- Jasypt : 整合spring boot加密应用配置文件敏感信息
- Spring Boot应用的后台运行配置
- springboot整合Quartz实现腾讯分_分彩源码出_售动态配置定时任务
- Spring Boot应用的后台运行配置
- Spring Boot应用的后台运行配置(转载)
- spring boot入门(二) 配置c3p0数据源连接Mysql数据库。最完整、简单易懂、详细的spring boot教程。
- springboot整合Quartz实现动态配置定时任务
- Spring Boot配置的第一个应用
- [转]Spring Boot应用的后台运行配置
- springboot动态配置定时任务2种方式,整合Quartz多线程并发执行多个定时任务配置
- SpringBoot中的Quartz应用
- Spring-boot整合Quartz,3、动态配置定时任务
- 实践:在tomcat中为springboot应用配置context
- spring boot 实际应用(一) 内置tomcat 实现JMX配置
- Spring Boot整合Quartz实现定时任务表配置
- Spring Boot 日志配置(超详细)
- 第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成
- Springboot中使用数据库配置Quartz定时任务
- springboot集成quartz配置多个job任务