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啓動的時候啓動,調用所有的任務執行。

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