Quartz學習(三)--簡單觸發器(SimpleTrigger)

  SimpleJob.java

public class SimpleJob implements Job {

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		// job 的名字
		String jobName = context.getJobDetail().getKey().getName();
		
		// 任務執行的時間
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");
		String jobRunTime = dateFormat.format(Calendar.getInstance().getTime());
		
		// 輸出任務執行情況
		System.out.println("任務 : " + jobName + " 在  " +jobRunTime + " 執行了 ");
	}
}
在這裏 對輸出 的日期進行了一小下 格式化,適應國人習慣.


SimpleTriggerExample.java

import static org.quartz.DateBuilder.futureDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.JobKey.jobKey;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.DateBuilder;
import org.quartz.DateBuilder.IntervalUnit;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Simple Triggers (簡單觸發器) 的使用.
 */
public class SimpleTriggerExample {

	public static void main(String[] args) throws Exception {
		SimpleTriggerExample example = new SimpleTriggerExample();
		example.run();
	}

	public void run() throws Exception {
		// 日期格式化
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");
		
		SchedulerFactory sf = new StdSchedulerFactory();
		Scheduler sched = sf.getScheduler();
		System.out.println("--------------- 初始化 -------------------");

		// 下一個第15秒 例:
		//           當前 10秒,則 執行時間爲15秒
		//           當前 16秒,則 執行時間爲30秒
		//           當前 33秒,則 執行時間爲45秒
		//           當前 48秒,則 執行時間爲00秒
		Date startTime = DateBuilder.nextGivenSecondDate(null, 15);

		// job1 將只會執行一次 
		JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();
		SimpleTrigger trigger = (SimpleTrigger) newTrigger()
				.withIdentity("trigger1", "group1")
				.startAt(startTime).build();
		// 把job1 和 trigger加入計劃   .  ft:此任務要執行的時間
		Date ft = sched.scheduleJob(job, trigger);
		System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
				+ trigger.getRepeatCount() + " 次, 每次間隔 "
				+ trigger.getRepeatInterval() / 1000 + " 秒");

		// job2 將只會和執行一次(和job1一樣一樣的,吼~~)
		job = newJob(SimpleJob.class).withIdentity("job2", "group1").build();
		trigger = (SimpleTrigger) newTrigger()
				.withIdentity("trigger2", "group1").startAt(startTime).build();
		ft = sched.scheduleJob(job, trigger);
		System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
				+ trigger.getRepeatCount() + " 次, 每次間隔 "
				+ trigger.getRepeatInterval() / 1000 + " 秒");

		// job3 將執行11次(執行1次,重複10次) ,每10秒重複一次
		job = newJob(SimpleJob.class).withIdentity("job3", "group1").build();
		trigger = newTrigger()
				.withIdentity("trigger3", "group1")
				.startAt(startTime)
				.withSchedule(
						simpleSchedule()
						.withIntervalInSeconds(10)// 重複間隔
						.withRepeatCount(10))     // 重複次數
						.build();
		ft = sched.scheduleJob(job, trigger);
		System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
				+ trigger.getRepeatCount() + " 次, 每次間隔 "
				+ trigger.getRepeatInterval() / 1000 + " 秒");

		
		// trigger3 改變了.  每隔10s重複.共重複2次
		// 此處說明 , 上面job3已經 設定了 trigger3 重複10次,每次10s
		//        在這裏又改變了 trigger3的設置,不會對以前構成影響,而是當做一個新的來處理
		trigger = newTrigger()
				.withIdentity("trigger3", "group2")
				.startAt(startTime)
				.withSchedule(
						simpleSchedule()
						.withIntervalInSeconds(10)
						.withRepeatCount(2))
						.forJob(job).build();
		ft = sched.scheduleJob(trigger);
		System.out.println(job.getKey().getName() + " 改變過trigger3屬性的job3 : " + dateFormat.format(ft) + " 時運行.並且重複: "
				+ trigger.getRepeatCount() + " 次, 每次間隔 "
				+ trigger.getRepeatInterval() / 1000 + " 秒");

		// job5 將在5分鐘後運行一次
		job = newJob(SimpleJob.class).withIdentity("job5", "group1").build();
		trigger = (SimpleTrigger) newTrigger()
				.withIdentity("trigger5", "group1")
				.startAt(futureDate(5, IntervalUnit.MINUTE)) // 設定5分鐘後運行
				.build();
		ft = sched.scheduleJob(job, trigger);
		System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
				+ trigger.getRepeatCount() + " 次, 每次間隔 "
				+ trigger.getRepeatInterval() / 1000 + " 秒");

		// job6  每40s運行一次,沒有指定重複次數,則無下限的重複
		job = newJob(SimpleJob.class).withIdentity("job6", "group1").build();
		trigger = newTrigger()
				.withIdentity("trigger6", "group1")
				.startAt(startTime)
				.withSchedule(
						simpleSchedule().withIntervalInSeconds(40)
								.repeatForever()).build();
		ft = sched.scheduleJob(job, trigger);
		System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
				+ trigger.getRepeatCount() + " 次, 每次間隔 "
				+ trigger.getRepeatInterval() / 1000 + " 秒");

		// 所有的任務都被加入到了 scheduler中 ,但只有 schedulers.start(); 時纔開始執行
		sched.start();
		System.out.println("------- 開始調度 (調用.start()方法) ----------------");
		System.out.println("-------系統 啓動 的 時間 :" + dateFormat.format(new Date()));

		// 在 scheduled.start(); 之後,還可以將 jobs 添加到執行計劃中
		// job7 將重複20次 ,每5分鐘重複一次
		job = newJob(SimpleJob.class).withIdentity("job7", "group1").build();
		trigger = newTrigger()
				.withIdentity("trigger7", "group1")
				.startAt(startTime)
				.withSchedule(
						simpleSchedule()
						.withIntervalInMinutes(5) // 5分鐘 
						.withRepeatCount(20))     // 重複20次
						.build();
		ft = sched.scheduleJob(job, trigger);
		System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
				+ trigger.getRepeatCount() + " 次, 每次間隔 "
				+ trigger.getRepeatInterval() / 1000 + " 秒");

		// job8  可以立即執行. 無trigger註冊
		job = newJob(SimpleJob.class).withIdentity("job8", "group1")
				.storeDurably().build();
		sched.addJob(job, true);
		System.out.println("手動觸發  job8...(立即執行)");
		sched.triggerJob(jobKey("job8", "group1"));

		System.out.println("------- 等待30 秒... --------------");

		try {
			Thread.sleep(30L * 1000L);
		} catch (Exception e) { }

		// job7 將馬上執行,重複10次,每秒一次
		System.out.println("-------  重新安排 ... --------------------");
		trigger = newTrigger()
				.withIdentity("trigger7", "group1")
				.startAt(startTime)
				.withSchedule(
						simpleSchedule().withIntervalInMinutes(5)
								.withRepeatCount(20)).build();

		ft = sched.rescheduleJob(trigger.getKey(), trigger);
		System.out.println("job7 被重新安排 在 : " + dateFormat.format(ft) +"  執行. \r   當前時間 :" + dateFormat.format(new Date())+"預定執行時間已過,任務立即執行");
		
		try {
			System.out.println("------- 等待5分鐘  ... ------------");
			Thread.sleep(300L * 1000L);
		} catch (Exception e) { }

		sched.shutdown(true);
		System.out.println("------- 調度已關閉 ---------------------");

		// 顯示一下  已經執行的任務信息
		SchedulerMetaData metaData = sched.getMetaData();
		System.out.println("~~~~~~~~~~  執行了 " + metaData.getNumberOfJobsExecuted() + " 個 jobs.");

	}

}

幾點說明:

1 DateBuilder.nextGivenSecondDate 的意思代碼中已經說明了,就是下一個你想要的時間,不懂的可以自己測試一下

2 同一個任務可以多次註冊.

3 重複執行 需要設置

   trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .startAt(startTime)
    .withSchedule(
      simpleSchedule()
      .withIntervalInSeconds(10)// 重複間隔
      .withRepeatCount(10))     // 重複次數
      .build();

   如果需要一直重複:  

    trigger = newTrigger()
    .withIdentity("trigger6", "group1")
    .startAt(startTime)
    .withSchedule(
      simpleSchedule().withIntervalInSeconds(40)
        .repeatForever()).build();

4 無trigger註冊,表示任務立即執行 : sched.addJob(job, true);

5 // 在scheduler.start之後調用,可以在job開始後重新定義trigger,然後重新註冊

    sched.rescheduleJob(trigger.getKey(), trigger);

發佈了27 篇原創文章 · 獲贊 22 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章