开发环境: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启动的时候启动,调用所有的任务执行。