Quartz版本為1.8.3
Spring版本為2.5
自定義作業(yè)表 QRTZ_JOB。
其中定義 作業(yè)標識、作業(yè)名稱、類名、觸發(fā)器名稱、觸發(fā)器腳本等。
下面看看在Spring中如何配置Quartz。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="false">
<context:component-scan base-package="com.jn" />
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.jn.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="proxoolDataSource" />
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<bean id="proxoolDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${dburl}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref local="proxoolDataSource"/>
</property>
<property name="configLocation">
<value>classpath:sql-map-config.xml</value>
</property>
</bean>
<bean name="quartzScheduler" lazy-init="true" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref ="proxoolDataSource" />
<property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>
</beans>
Main.java
package com.jn.common;

import com.jn.qrtz.job.JobManager;
import com.jn.spring.BeanFactory;


/** *//**
* 啟動類
* @author l
*/

public class Main
{

/** *//**
* 啟動函數(shù)
* @param args
*/

public static void main(String[] args)
{

try
{
JobManager mgr = (JobManager)BeanFactory.factory().getBean("jobManager");
mgr.init();
mgr.dispatch();
}

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

JobManager.java
package com.jn.qrtz.job;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.jn.persistence.QrtzDaoImpl;
import com.jn.qrtz.JobConfig;
import com.jn.qrtz.service.SchedulerServiceImpl;


/** *//**
* 作業(yè)管理類
*
* @author l
*/
@Component("jobManager")
@Scope("singleton")

public class JobManager
{
private Logger log = Logger.getLogger(JobManager.class);

@Autowired(required = true)
private QrtzDaoImpl qrtzDao;

@Autowired(required = true)
private SchedulerServiceImpl schedulerService;


/** *//** 作業(yè)列表 */
private List<JobConfig> allJobs = new ArrayList<JobConfig>();


/** *//**
* 初始化作業(yè)列表
*/

public synchronized void init()
{

try
{
allJobs = qrtzDao.queryAllJobs();
log.info("作業(yè)初始化完成。");
}

catch (SQLException e)
{
log.error("初始化作業(yè)失敗。" + e.getMessage());
}
}


/** *//**
* 系統(tǒng)啟動時派發(fā)作業(yè)
*/

public void dispatch()
{

for (JobConfig job : allJobs)
{

try
{
schedulerService.schedule(job);
}

catch (Exception e)
{
e.printStackTrace();
log.error(job.toString() + "派發(fā)失敗。" + e.getMessage());
}
}
}


public SchedulerServiceImpl getSchedulerService()
{
return schedulerService;
}

public void setSchedulerService(

@Qualifier("schedulerService") SchedulerServiceImpl schedulerService)
{
this.schedulerService = schedulerService;
}


public QrtzDaoImpl getQrtzDao()
{
return qrtzDao;
}


public void setQrtzDao(@Qualifier("qrtzDao") QrtzDaoImpl qrtzDao)
{
this.qrtzDao = qrtzDao;
}
}

其中QrtzDaoImpl對象是用于從QRTZ_JOB表中取得作業(yè)列表,并將作業(yè)封裝為JobConfig對象。
SchedulerServiceImpl對象用于派發(fā)Job。
SchedulerServiceImpl.java
package com.jn.qrtz.service;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.jn.qrtz.JobConfig;
import com.jn.qrtz.job.WorkDispatcher;


/** *//**
* 作業(yè)派發(fā)、移除類
* @author l
*/
@Component("schedulerService")

public class SchedulerServiceImpl
{
@Autowired
private Scheduler scheduler;


/** *//**
* 移除作業(yè)
* @param config
* @return
* @throws SchedulerException
*/

public boolean remove(JobConfig config) throws SchedulerException
{

if(config == null)
{
return false;
}
return removeJob(config.getJobName(), config.getJobGroup());
}


/** *//**
* 派發(fā)作業(yè)
* @param config
* @throws Exception
*/

public void schedule(JobConfig config) throws Exception
{
String triggerName = config.getTriggerName();
String triggerGroup = config.getTriggerGroup();
String cronStr = config.getTriggerScript();
String jobName = config.getJobName();
String jobGroup = config.getJobGroup();
JobDetail jobDetail = new JobDetail(jobName, jobGroup, WorkDispatcher.class);
jobDetail.getJobDataMap().put(JobConfig.EXEC_INFO, config.cloneInfo());
schedule(triggerName, triggerGroup, cronStr, jobDetail);
}


/** *//**
* 派發(fā)作業(yè)
* @param name
* @param group
* @param cronStr
* @param jobDtl
* @throws Exception
*/
private void schedule(String name, String group, String cronStr, JobDetail jobDtl)

throws Exception
{
CronTrigger cronTrigger = new CronTrigger(name, group, jobDtl.getName(), jobDtl.getGroup(),
cronStr);
scheduler.scheduleJob(jobDtl, cronTrigger);
}


/** *//**
* 移除作業(yè)
* @param jobName
* @param group
* @return
* @throws SchedulerException
*/

private boolean removeJob(String jobName, String group) throws SchedulerException
{
scheduler.pauseJob(jobName, group);
return scheduler.deleteJob(jobName, group);
}
@Autowired

public void setScheduler(@Qualifier("quartzScheduler") Scheduler scheduler)
{
this.scheduler = scheduler;
}
}
由這些代碼,便可以通過Quartz框架去調(diào)度 我們定義在QRTZ_JOB表中的作業(yè)了。
由于Quartz框架本身依賴一些表,其中我們執(zhí)行的作業(yè),同樣會被框架保存在那些它所依賴的表中,
如:qrtz_job_details表。
當Spring加載quartzScheduler時,Quartz框架會被自動啟動并調(diào)度保存在qrtz_job_details表中的作業(yè)。
所以再次啟動時,應(yīng)先將 Quartz依賴的表清空。
當然這個操作也可以被集成在代碼中。
還有另外一種方案可實現(xiàn)此的功能,便是重寫org.springframework.scheduling.quartz.SchedulerFactoryBean類,
自定義類繼承此類,在自定義的類中注入自己的對象,在其中取得 作業(yè)列表,
并生成Trigger對象數(shù)組,調(diào)用 org.springframework.scheduling.quartz.SchedulerFactoryBean 類的setTriggers(Trigger[]) 方法。
設(shè)置好Trigger數(shù)據(jù)。
最后再 調(diào)用Scheduler的start()方法,Quartz便可調(diào)度這些作業(yè)了。
本文為原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處BlogJava。