開發環境: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:ScheduleServletpackage 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啓動的時候啓動,調用所有的任務執行。