参考网上一些资料,写了一个demo,主要实现在web应用启动时,根据数据库中保存的job信息,启动所有job。在此仅列出quartz相关类代码。
源码免积分下载:http://download.csdn.net/detail/daxiang12092205/8008505
JobMainStart.java:
package com.xy6.quartzweb.job;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import com.xy6.quartzweb.JobDAO;
import com.xy6.quartzweb.JobForm;
/*
* 作者:daxiang
* 日期:2014-10-06
* 功能:启动所有job的主入口,在web启动时,调用该类init方法。
*/
public class JobMainStart extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init() throws ServletException {
this.startJobProc();
this.startJobClass();
}
/*
* 启动所有调度对象为java类的job
*/
private void startJobClass(){
// 获取调度对象为java类的job列表
// 遍历
// 调用startRunClass
JobDAO objJobDAO = new JobDAO();
String strSQL = "select * from test_zl_job where job_target_type = 1";
List<JobForm> listJobForm = objJobDAO.queryJobList(strSQL);
for(JobForm jobForm : listJobForm){
this.startRunClass(jobForm);
}
System.out.println("---定时调度类启动");
}
/*
* 启动所有调度对象为存储过程的job
*/
private void startJobProc(){
// 获取调度对象为存储过程的job列表
// 遍历
// 调用startRunProc
JobDAO objJobDAO = new JobDAO();
String strSQL = "select * from test_zl_job where job_target_type = 0";
List<JobForm> listJobForm = objJobDAO.queryJobList(strSQL);
for(JobForm jobForm : listJobForm){
this.startRunProc(jobForm);
}
System.out.println("---定时存储过程类启动");
}
/*
* 根据job信息,启动调度对象为java类的job
*/
private void startRunClass(JobForm objJobForm){
Class<?> targetClass = null;
try{
targetClass = Class.forName(objJobForm.getJobTarget());
// 1、创建JobDetial对象
JobDetail jobDetail = new JobDetail();
jobDetail.setJobClass(targetClass);
jobDetail.setName(objJobForm.getJobName());
jobDetail.setGroup(objJobForm.getJobGroupName());
// 2、创建CronTrigger对象
CronTrigger cTrigger = new CronTrigger();
cTrigger.setName(objJobForm.getTriggerName());
cTrigger.setGroup(objJobForm.getTriggerGroupName());
cTrigger.setCronExpression(objJobForm.getTriggerCronExp());
cTrigger.setStartTime(new Date());
// 3、创建Scheduler对象,并配置JobDetail和Trigger对象
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = null;
scheduler = sf.getScheduler();
scheduler.scheduleJob(jobDetail, cTrigger);
// 4、并执行启动、关闭等操作
scheduler.start();
// 5、操作job的方法
// 删除一个任务
scheduler.deleteJob("b", "jobgroup2");
// 停止一个任务
scheduler.unscheduleJob("c", "c");
// 暂停一个任务
scheduler.pauseJob("a", "jobgroup1");
// 重启一个任务
// scheduler.resumeJob("a", "jobgroup1");
} catch(Exception ex){
ex.printStackTrace();
}
}
/*
* 根据job信息,启动调度对象为存储过程的的job
*/
private void startRunProc(JobForm objJobForm){
try{
// 1、创建JobDetial对象
JobDetail jobDetail = new JobDetail();
jobDetail.setJobClass(JobExecProc.class);
jobDetail.setName(objJobForm.getJobName());
jobDetail.setGroup(objJobForm.getJobGroupName());
jobDetail.getJobDataMap().put("strProcName", objJobForm.getJobTarget());
// 2、创建CronTrigger对象
CronTrigger cTrigger = new CronTrigger();
cTrigger.setName(objJobForm.getTriggerName());
cTrigger.setGroup(objJobForm.getTriggerGroupName());
cTrigger.setCronExpression(objJobForm.getTriggerCronExp());
cTrigger.setStartTime(new Date());
// 3、创建Scheduler对象,并配置JobDetail和Trigger对象
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = null;
scheduler = sf.getScheduler();
scheduler.scheduleJob(jobDetail, cTrigger);
// 4、并执行启动、关闭等操作
scheduler.start();
} catch(Exception ex){
ex.printStackTrace();
}
}
}
JobExecProc.java:
package com.xy6.quartzweb.job;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.xy6.quartzweb.JobDAO;
import com.xy6.quartzweb.JobUtil;
/*
* 作者:daxiang
* 日期:2014-10-06
* 功能:调度对象为存储过程的job实现类,每次执行job时,即运行该类execute方法
*/
public class JobExecProc implements Job {
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// 获取存储过程列表
// 调用所有的存储过程
JobDAO objJobDAO = new JobDAO();
JobDataMap mapData = arg0.getJobDetail().getJobDataMap();
// 获取从调用处传入的参数:存储过程名称
String strProcName = mapData.getString("strProcName");
String strCallProc = "{call " + strProcName + "()}";
System.out.println("---" + strCallProc + "," + JobUtil.getCurTime());
objJobDAO.opeateDateBase(strCallProc);
}
}
JobOutHello.java:
package com.xy6.quartzweb.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import com.xy6.quartzweb.JobUtil;
/*
* 作者:daxiang
* 日期:2014-10-06
* 功能:调度对象为JobOutHello的job实现类,每次执行job时,输出hello等字符
*/
public class JobOutHello implements StatefulJob {
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("---hello," + JobUtil.getCurTime());
}
}
JobAction.java:
package com.xy6.quartzweb;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
/*
* 作者:daxiang
* 日期:2014-10-06
* 功能:job主列表action类
*/
public class JobAction extends Action {
private static final long serialVersionUID = 1L;
private final JobDAO objJobDAO = new JobDAO();
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
JobForm objJobForm = (JobForm)form;
String strActionType = objJobForm.getActionType();
if(StringUtils.isBlank(strActionType)){
List<JobForm> listJobForm = this.readJobList("");
request.setAttribute("list", listJobForm);
} else if("delete".equals(strActionType)){
if(this.deleteJob(objJobForm) > 0){
objJobForm.setActionMessage("删除成功");
} else{
objJobForm.setActionMessage("删除失败");
}
List<JobForm> listJobForm = this.readJobList("");
request.setAttribute("list", listJobForm);
}
ActionForward forward = new ActionForward();
forward = mapping.findForward("success");
return forward;
// 编写action,实现读取、新增、修改、删除方法
// 修改VO
// 修改DAO
// 修改xml文件
// 编写jsp页面,列表页,编辑页面
}
private List<JobForm> readJobList(String strJobId){
String strSQL = "select * from test_zl_job ";
if(StringUtils.isNotEmpty(strJobId)){
strSQL += "where job_id = '" + strJobId + "'";
}
List<JobForm> listJobForm = objJobDAO.queryJobList(strSQL);
this.refreshJobState(listJobForm);
return listJobForm;
}
private int deleteJob(JobForm objJobForm){
return objJobDAO.deleteDataBase(objJobForm);
}
private void refreshJobState(List<JobForm> listJobForm){
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = null;
try{
scheduler = sf.getScheduler();
String strState = "";
for(JobForm jobForm : listJobForm){
// 根据定时器名称,定时器组名获取定时器状态,即job的状态
int iTriggerState = scheduler.getTriggerState(jobForm.getTriggerName(),jobForm.getTriggerGroupName());
strState = JobUtil.getTriggerState(iTriggerState);
jobForm.setJobStatus(strState);
}
} catch(Exception ex){
ex.printStackTrace();
}
}
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>start job schedule</servlet-name>
<servlet-class>com.xy6.quartzweb.job.JobMainStart</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>JobList.jsp</welcome-file>
</welcome-file-list>
<jsp-config>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
难点:
程序启动时,开始定时调用存储过程(开始不知道quartz有传参功能,卡了好久,后经朋友指点,秒杀);
主列表中展示job当前的状态(开始一直想着找job的state,而没有找trigger的state,方向错了,trigger的state其实就是job的state);