(一)spring3.2.0 quartz-2.2.1 整合 实现动态定时任务 解决service为null问题
来源:互联网 发布:买情趣 淘宝 编辑:程序博客网 时间:2024/05/18 21:39
spring3.2.0 quartz-2.2.1 实现动态定时任务
spring 和 quartz的整合很简单,但是实现动态定时任务却有一点麻烦,下面详细介绍一下 spring3.2.0和quzrtz2.2.1 的整合 实现定时任务的的动态加载
项目整体结构介绍:
需要的jar以及整体结构如下
类介绍:
AutoJobDTO.java 里面就是一些job的信息,jobname groupname等;JobAction.java 自动任务调度;JobManager.java 任务的管理(新增,删除,暂停等 这里举例新增的,其余的可以看官网API)JobService.java 动态造数据,调用JobManager 添加任务; quartz 中的 job如何自动注入spring容器托管的对象?MyJobFactory.java 这个类可以为大家说明;TestService.java 这个类就用来测试一下注入;
AutoJobDTO.java
- package quartz;
-
-
-
-
-
- public class AutoJobDTO {
- private String job_id;
- private String job_name;
- private String job_group;
- private String job_time; {get set ....}
JobAction.java
- package quartz;
- import javax.annotation.Resource;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.beans.factory.annotation.Autowired;
-
-
- public class JobAction implements Job {
-
- @Autowired
- private TestService testService;
- {get set ...}
- @Override
- public void execute(JobExecutionContext arg0) throws JobExecutionException {
- System.out.println("任务成功运行------");
- AutoJobDTO detailInfo = (AutoJobDTO)arg0.getMergedJobDataMap().get("scheduleJob");
- System.out.println("任务名称 = [" + detailInfo.getJob_name()+ "]");
- if(testService==null){
- System.out.println("注入不成功------");
- }else{
- System.out.println("注入成功------");
- testService.add();
- }
-
- }
-
- }
JobManager.action
- package quartz;
- import java.text.ParseException;
- import javax.annotation.Resource;
- import org.quartz.CronScheduleBuilder;
- import org.quartz.CronTrigger;
- import org.quartz.JobBuilder;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerException;
- import org.quartz.TriggerBuilder;
- import org.quartz.TriggerKey;
-
- public class JobManager {
-
-
-
-
-
-
-
-
-
- @Resource
- private Scheduler scheduler ;
-
- public Scheduler getScheduler() {
- return scheduler;
- }
-
- public void setScheduler(Scheduler scheduler) {
- this.scheduler = scheduler;
- }
-
-
-
-
- public void addJob(AutoJobDTO job,Class classz) throws SchedulerException {
-
- TriggerKey triggerKey = TriggerKey.triggerKey(job.getJob_name(), job.getJob_group());
- CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
- if(trigger==null){
- System.out.println("trigger is null----");
-
- JobDetail jobDetail = JobBuilder.newJob(classz).withIdentity(job.getJob_name(), job.getJob_group()).build();
- jobDetail.getJobDataMap().put("scheduleJob", job);
-
- CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getJob_time());
-
- trigger = TriggerBuilder.newTrigger().withIdentity(job.getJob_name(), job.getJob_group()).withSchedule(scheduleBuilder).build();
- scheduler.scheduleJob(jobDetail,trigger);
- }else{
-
-
- CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getJob_time());
-
- trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
-
- scheduler.rescheduleJob(triggerKey, trigger);
- }
- }
-
-
-
- public void startJobs() {
- try {
- scheduler.start();
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
- }
JobService.java
- package quartz;
-
- import javax.annotation.Resource;
-
- import org.quartz.SchedulerException;
-
-
-
-
-
-
-
-
- public class JobService {
- @Resource
- private JobManager jobManager;
-
- public JobManager getJobManager() {
- return jobManager;
- }
- public void setJobManager(JobManager jobManager) {
- this.jobManager = jobManager;
- }
-
-
-
-
-
- public void loadJobInit() throws SchedulerException{
- System.out.println("init---");
- AutoJobDTO job = new AutoJobDTO();
- job.setJob_id("Id1");
- job.setJob_name("Name1");
- job.setJob_group("linGroup");
- job.setJob_time("0/30 * * * * ?");
- jobManager.addJob(job, JobAction.class);
- jobManager.startJobs();
- }
-
- }
TestService.java
- package quartz;
-
- public class TestService {
-
-
- public void add(){
- System.out.println("注入测试----");
- }
- }
MyJobFactory.java这个类是重写 AdaptableJobFactory 的createJobInstance这个方法,具体原因参见:http://blog.csdn.net/linlinv3/article/details/49450775
- package spring;
-
- 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;
-
- public class MyJobFactory extends AdaptableJobFactory {
-
-
- @Autowired
- private AutowireCapableBeanFactory capableBeanFactory;
-
- protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
-
- Object jobInstance = super.createJobInstance(bundle);
-
- capableBeanFactory.autowireBean(jobInstance);
- return jobInstance;
- }
- }
或者这么写也可以,因为有情况说上述方法打包后 注入不进去
- package com.summoner.service.job.impl;
-
- import javax.annotation.Resource;
-
- import org.quartz.spi.TriggerFiredBundle;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ApplicationContextAware;
- import org.springframework.scheduling.quartz.AdaptableJobFactory;
-
-
- public class MyJobFactory extends AdaptableJobFactory implements ApplicationContextAware {
-
-
-
-
-
- ApplicationContext applicationContext;
-
-
-
-
-
-
-
-
-
-
-
-
- @Override
- protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
-
- Object jobInstance = super.createJobInstance(bundle);
-
-
- AutowireCapableBeanFactory aaa = applicationContext.getAutowireCapableBeanFactory();
- aaa.autowireBeanProperties(jobInstance, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);
-
-
- return jobInstance;
- }
-
-
- @Override
- public void setApplicationContext(ApplicationContext applicationContext)
- throws BeansException {
- this.applicationContext = applicationContext;
-
- }
- }
spring 配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
- xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="
- http:
- http:
- http:
- http:
- >
- <context:component-scan base-package="quartz" />
- <bean id="testService" class="quartz.TestService"></bean>
- <bean id="jobFactory" class="spring.MyJobFactory"></bean>
- <bean id="Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="jobFactory" ref="jobFactory" />
- </bean>
- <bean id="jobManager" class="quartz.JobManager"> </bean>
- <bean id="JobService" class="quartz.JobService" init-method="loadJobInit"></bean>
- </beans>
然后启动程序就能看到定时任务的加载,console输出