Quartz Scheduler定時調度初體驗

什麼是Quartz

  1. Quartz是一個完全由java編寫的開源作業調度框架。Quartz是功能強大的開源作業調度庫,幾乎可以集成到任何Java應用程序中-從最小的獨立應用程序到最大的電子商務系統。Quartz可用於創建簡單或複雜的計劃,以執行數以萬計,數以萬計的工作。任務定義爲標準Java組件的作業,它們實際上可以執行您可以對其執行的任何編程操作。Quartz Scheduler包含許多企業級功能,例如對JTA事務和集羣的支持。

Quartz相對於Timer的優勢

  1. Timer定時器沒有持久化機制。
  2. Timer定時器的日程管理不夠靈活(只能設置開始時間、重複的間隔,設置特定的日期、時間等)
  3. Timer定時器沒有使用線程池(每個Java定時器使用一個線程)
  4. Timer定時器沒有切實的管理方案,你不得不自己完成存儲、組織、恢復任務的措施

Quartz及相關依賴

  Quartz jar包:https://repo1.maven.org/maven2/org/quartz-scheduler/quartz/2.3.0/quartz-2.3.0.jar
  Quartz-jobs :https://repo1.maven.org/maven2/org/quartz-scheduler/quartz-jobs/2.3.0/quartz-jobs-2.3.0.jar

Quartz的簡單實現

	import org.quartz.JobDetail;
	import org.quartz.Scheduler;
	import org.quartz.SchedulerException;
	import org.quartz.Trigger;
	import org.quartz.impl.StdSchedulerFactory;
	import static org.quartz.JobBuilder.*;
	import static org.quartz.TriggerBuilder.*;
	import static org.quartz.SimpleScheduleBuilder.*;
	
	public class QuartzTest {
	
	    public static void main(String[] args) {
	
	        try {
	            // Grab the Scheduler instance from the Factory
	            /**
	             * 一旦使用獲取了調度程序StdSchedulerFactory.getDefaultScheduler(),
	             * 您的應用程序將不會終止,直到您調用爲止scheduler.shutdown(),因爲將有活動線程。
	             */
	            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
	
	            // and start it off
	            scheduler.start();
	
	            //定義作業並將其綁定到我們的HelloJob類
	            JobDetail job = newJob(HelloJob.class)
	                    .withIdentity("job1", "group1")
	                    .build();
	
	            // 觸發作業以立即運行,然後每40秒重複一次
	            /*Trigger trigger = newTrigger()
	                    .withIdentity("trigger1", "group1")
	                    .startNow()
	                    .withSchedule(simpleSchedule()
	                            .withIntervalInSeconds(40)
	                            .repeatForever())
	                    .build();*/
	            //使用是Cron表達式 執行定時任務,24h制,17:27執行   --- 0 27 17 * * ?  
	            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 27 17 * * ?");
	            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
	                    .withSchedule(scheduleBuilder).build();
	
	            // 告訴scheduler使用我們的觸發器
	            scheduler.scheduleJob(job, trigger);
	            Thread.sleep(60000);//線程休眠60s,期間程序不會自動停止
	            scheduler.shutdown(); 
	
	        } catch (SchedulerException | InterruptedException se) {
	            se.printStackTrace();
	        }
	    }
	}

	import org.quartz.Job;
	import org.quartz.JobExecutionContext;
	import org.quartz.JobExecutionException;
	
	public class HelloJob implements Job {
	
	    @Override
	    public void execute(JobExecutionContext context) throws JobExecutionException {
	        System.out.println("具體定時業務實現");
	    }
	}

Tip:一旦使用獲取了調度程序StdSchedulerFactory.getDefaultScheduler(),因爲有活動線程的存在,應用程序將不會終止,直到調用scheduler.shutdown()爲止。

定時任務中的Cron表達式

Cron表達式在線生成地址 :http://cron.qqe2.com/

字段 允許值 允許的特殊字符 秒
0-59 , - * / 分
0-59 , - * / 小時
0-23 , - * / 日期
1-31 , - * ? / L W C 月份
1-12 或者 JAN-DEC , - * / 星期
1-7 或者 SUN-SAT , - * ? / L C # 年(可選) 留空, 1970-2099 , - * /
“0 0 12 * * ?” 每天中午12點觸發
“0 15 10 ? * *” 每天上午10:15觸發
“0 15 10 * * ?” 每天上午10:15觸發
“0 15 10 * * ? *” 每天上午10:15觸發
“0 15 10 * * ? 2005” 2005年的每天上午10:15觸發
“0 * 14 * * ?” 在每天下午2點到下午2:59期間的每1分鐘觸發
“0 0/5 14 * * ?” 在每天下午2點到下午2:55期間的每5分鐘觸發
“0 0/5 14,18 * * ?” 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
“0 0-5 14 * * ?” 在每天下午2點到下午2:05期間的每1分鐘觸發
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44觸發
“0 15 10 ? * MON-FRI” 週一至週五的上午10:15觸發
“0 15 10 15 * ?” 每月15日上午10:15觸發
“0 15 10 L * ?” 每月最後一日的上午10:15觸發
“0 15 10 ? * 6L” 每月的最後一個星期五上午10:15觸發
“0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最後一個星期五上午10:15觸發
“0 15 10 ? * 6#3” 每月的第三個星期五上午10:15觸發

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