struts1中使用quartz

参考网上一些资料,写了一个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();
		}
	}
}


web.xml:

<?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);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值