quartz web服务器定时任务

开发环境:myeclipse+tomcat+jdk

开发需要包:quartz.jar,log4j-1.2.14.jar  quartz框架网上也有些其他包,但在编程的时候,发现少了些类,这个包有使程序跑起来的方法

开发模块包括几个部分:1 服务器启动后需要调用的servlet,2 任务执行类,3 调用任务的类

对程序的步骤理解:1 确定任务 2 确定触发器(过多久执行任务的一个表达式 cron) 3 定时任务将任务和触发器连起来,启动(start)

网上找了一些是执行单任务的,这个可以执行多个任务,可以把多个任务写在xml文件中,存储建立任务的必要信息


程序目录:用到其中一部分。

程序代码一:测试类

package com.taikang.schdule;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.ee.ejb.ServletInvokerJob;
import org.quartz.impl.StdSchedulerFactory;

public class TestSchdule {
	private static final String jobName = "firstJob";
	private static final String jobGroupName = "Group";
	private static final String triggerName = "trigger";
	private static final String triggerGroupName = "triggerGroup";
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("start schdule...");
		try
		{
			//从框架获取调度器
//			Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//			//创建需要执行的任务,根据后边的任务类
//			JobDetail jobDetail = new JobDetail(jobName,jobGroupName,Schdule.class);
//			//创建简单触发器,还有其他几个触发器类
//			SimpleTrigger simpleTrigger = new SimpleTrigger(triggerName,triggerGroupName);
//			//将触发器加入定时任务,将定时任务和触发器(什么时候执行)连接起来
//			scheduler.scheduleJob(jobDetail,simpleTrigger);
//			//开启任务调度器
//			scheduler.start();
			
			Scheduler scheduler1 = StdSchedulerFactory.getDefaultScheduler();
//			JobDetail jobDetail1 = new JobDetail("secondJob",jobGroupName,com.taikang.schdule.ScheduleTaskTwo.class);
			JobDetail jobDetail1 = new JobDetail("secondJob",jobGroupName,ServletInvokerJob.class);
			String stringUrl = "http://127.0.0.1:9080/alltest/Schedule?type=task2";
			jobDetail1.getJobDataMap().put("bean",stringUrl);
			CronTrigger cronTrigger = new CronTrigger("secondtriggerName",triggerGroupName);
			String cron = "0/5 * * * * ?";
			cronTrigger.setCronExpression(cron);
			scheduler1.scheduleJob(jobDetail1,cronTrigger);
//			//开启任务调度器
//			scheduler.start();
//			//停止任务调度器
//			scheduler.shutdown();
			
			scheduler1.start();
//			scheduler1.shutdown();
			
			System.out.println("job is TestSchedule running-----");
			
			Scheduler scheduler3 = StdSchedulerFactory.getDefaultScheduler();
			JobDetail jobDetail3 = new JobDetail("thirdJob",jobGroupName,ServletInvokerJob.class);
			stringUrl = "http://10.136.16.161:9080/alltest/Schedule?type=task3";
			jobDetail3.getJobDataMap().put("bean",stringUrl);
			CronTrigger cronTrigger3 = new CronTrigger("thirdtriggerName",triggerGroupName);
			String cron3 = "0/1 * * * * ?";
			cronTrigger3.setCronExpression(cron3);
			scheduler3.scheduleJob(jobDetail3,cronTrigger3);
			scheduler3.start();
		} catch (SchedulerException e) {
			System.out.println("error:" + e.getMessage());
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("end schdule...");
	}
}
上述类中,可能需要在配置xml中写的有:stringUrl,需要用程序控制的是cronTrigger构造对象中的第一个参数如:secondtriggername字符串和JobDetail对象的第一个参数。


任务接口类:ScheduleService

package com.taikang.schdule;

public interface ScheduleService {
	public void invoke();
}

任务实现类一:ScheduleTaskTwo

package com.taikang.schdule;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class ScheduleTaskTwo implements Job,ScheduleService
{

	public void invoke()
	{
		System.out.println("执行第 二 个schedule!");
	}
	
	public void execute(JobExecutionContext context) throws JobExecutionException
	{
		// TODO Auto-generated method stub
		System.out.println("现在执行第二个定时程序。。。");
	}
}

任务实现类第二个:ScheduleTaskThree
<pre name="code" class="html">package com.taikang.schdule;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class ScheduleTaskThree implements ScheduleService{

	public void invoke()
	{
		System.out.println("执行第 三 个schedule!");
	}
}
测试类中指定地址调用的servlet:ScheduleServlet
package com.taikang.schdule;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.ee.ejb.ServletInvokerJob;
import org.quartz.impl.StdSchedulerFactory;

public class ScheduleServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	private static final String CONTENT_TYPE = "text/html";
	
	private static final String jobName = "firstJob";
	private static final String jobGroupName = "Group";
	private static final String triggerName = "trigger";
	private static final String triggerGroupName = "triggerGroup";
	
	 public void doGet( HttpServletRequest request, HttpServletResponse response )
     throws ServletException, IOException
     {
	     response.setContentType( CONTENT_TYPE );
	     System.out.println("schedulelog: get Scheduling Job ..====================");
	     String type = request.getParameter("type");
	     deal(type);
     }
	 
	 public void doPost( HttpServletRequest request, HttpServletResponse response )
     throws ServletException, IOException
     {
	     response.setContentType( CONTENT_TYPE );
	     System.out.println("schedulelog:post Scheduling Job ..====================");
	     String type = request.getParameter("type");
	     deal(type);
     }
	 
	 private void deal(String type)
	 {
		 String classes = "";
		 if(type.equals("task2"))
			 classes = "com.taikang.schdule.ScheduleTaskTwo";
		 else
			 classes = "com.taikang.schdule.ScheduleTaskThree";
		 try {
			ScheduleService s  = (ScheduleService)Class.forName(classes).newInstance();
			s.invoke();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	 }
}

在web.xml中添加servlet的内容:
	<servlet>
		<servlet-name>Schedule</servlet-name>
		<servlet-class>com.taikang.schdule.ScheduleServlet</servlet-class>
	</servlet>

在开发中可能会使用到的xml配置内容和格式:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Schedule PUBLIC "//schedule" "schedule.dtd">
<schedule>
	<description>任务配置类</description>
   	<serviceUrl>http://10.136.16.161:8080/schedule/someschedule.jsp</serviceUrl>
	<service name="Service" class ="SendPicToECM" cron="0 20 11 * * ?">
		<description>状态</description>
	</service>
</schedule>

这里边的serviceUrl对应测试类中需要调用的地址,service节点作为一个任务,name:任务名;class:需要被实例化的类名称全路径;cron:定时任务表达式;

启动的时候,写作一个servlet在tomcat启动的时候启动,调用所有的任务执行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章