spring与quartz整合问题汇总

背景: 对于定时任务处理,spring有自带的scheduler,但是比较的简单的定时使用该配置是比较好的,可以进行解决,但是定时任务比较的多了使用quartz进行配置管理比较的方便。本文主要介绍quartz的配置,下篇文章在介绍scheduler的配置

1、quartz使用专有的数据库表,这些表可以官网下载,根据数据库的版本选择下载quartz版本

2、spring与quartz的配置,有很多种配置,本文介绍使用jdbc的方式进行配置。

quartz.propertie配置文件

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#

#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName: zjhdd_scheduler
org.quartz.scheduler.instanceId = AUTO

org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 2
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: 60000
#============================================================================
# Configure JobStore
#============================================================================

#default config
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
#\u6301\u4E45\u5316\u914D\u7F6E
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:true

#============================================================================
#havent cluster spring
#============================================================================
org.quartz.jobStore.isClustered = false  

#数据源
org.quartz.jobStore.tablePrefix:QRTZ_
org.quartz.jobStore.dataSource:qzDS

#============================================================================
# Configure Datasources
#============================================================================
#JDBC\u9A71\u52A8
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://192.168.*.*:3306/quartz
org.quartz.dataSource.qzDS.user:lll
org.quartz.dataSource.qzDS.password:lll
org.quartz.dataSource.qzDS.maxConnection:10

 spring与quartz整合的配置文件,在spring配置文件加入如下配置文件

<bean name="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="configLocation" value="classpath:quartz.properties"/>   
</bean>

总结: 这样quartz的配置就道理可以了,只需要编写测试类进行测试

测试类

MyJob类

package com.zxn.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
// 该类主要是实现job,定时任务的执行类
public class MyJob implements Job{

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		
		System.out.println("congratunation you have success!");
		
	}

}

MyJobTest类

package com.zxn.quartz;

import java.text.ParseException;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
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.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/applicationContext.xml"})
public class MyJobTest {
   
	 @Test
	 public void Test() throws SchedulerException,ParseException {
       startSchedule();
        //resumeJob();
     }
/**
* 开始一个simpleSchedule()调度
*/
   public static void startSchedule() {
    try {
     // 1、创建一个JobDetail实例,指定Quartz
     JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
     // 任务执行类
             .withIdentity("job1_1", "jGroup1")
             // 任务名,任务组
             .build();


     //触发器类型
    //   SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule();
             // 设置执行次数
         //    .repeatSecondlyForTotalCount(5);

     CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");
     // 2、创建Trigger
     Trigger trigger = TriggerBuilder.newTrigger()
             .withIdentity("trigger1_1", "tGroup1").startNow()
             .withSchedule(builder)
             .build();

     // 3、创建Scheduler
     Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
     scheduler.start();
     // 4、调度执行
     scheduler.scheduleJob(jobDetail, trigger);
     try {
         Thread.sleep(60000);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }

     //关闭调度器
     scheduler.shutdown();

 } catch (SchedulerException e) {
     e.printStackTrace();
 }
}

/**
* 从数据库中找到已经存在的job,并重新开户调度
*/
public static void resumeJob() {
 try {

     SchedulerFactory schedulerFactory = new StdSchedulerFactory();
     Scheduler scheduler = schedulerFactory.getScheduler();
     JobKey jobKey = new JobKey("job1_1", "jGroup1");
     List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
     //SELECT TRIGGER_NAME, TRIGGER_GROUP FROM {0}TRIGGERS WHERE SCHED_NAME = {1} AND JOB_NAME = ? AND JOB_GROUP = ?
     // 重新恢复在jGroup1组中,名为job1_1的 job的触发器运行
     if(triggers.size() > 0){
         for (Trigger tg : triggers) {
             // 根据类型判断
             if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) {
                 // 恢复job运行
                 scheduler.resumeJob(jobKey);
             }
         }
         scheduler.start();
     }

 } catch (Exception e) {
     e.printStackTrace();

 }
}
}

小结: 可以进行单元测试

问题: 但是该类进行的配置,quartz的job类里面无法加载spring的bean,通过搜索找到网上的解决办法

编写JobFactory类

public class JobFactory  extends AdaptableJobFactory{
   
	 @Resource
	 private AutowireCapableBeanFactory  capableBeanFactory;  
	  
	    @Override  
	    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {  
	        //调用父类的方法  
	        Object jobInstance = super.createJobInstance(bundle);  
	        //进行注入  
	        capableBeanFactory.autowireBean(jobInstance);  
	        return jobInstance;  
	    }  
}

    然后修改spring配置

<bean id="jobFactory" class="com.zjdx.core.quartz.entity.JobFactory"></bean>  
	<bean name="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="configLocation" value="classpath:quartz.properties"/>   
        <property name="jobFactory" ref="jobFactory"></property>
</bean>
这样就在job类中注解spring的bean了


猜你喜欢

转载自blog.csdn.net/yuanyuan214365/article/details/80079244