1. 程式人生 > >Java定時器和Quartz

Java定時器和Quartz

一、前言

Quartz與原生的定時器之間的區別,不懂的請自行百度

二、自定義定時器

在學習一個框架之前,喜歡先想想我有沒有能力實現一個簡單的類似功能,定時器還是比較簡單,可以一試。

/** * 自定義一個定時器 * @author lw */ public class MyTimer extends Thread{ private Long time ; public MyTimer(Long time) { this.time = time; } @Override public void run() { while(true){ try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } send(); } } /** * 開始執行任務 */ public void execute(){ this.start(); } /** * 定時任務 */ private void send() { System.out.println("任務執行了:" + new Date()); } public static void main(String[] args) { MyTimer myTimer = new MyTimer(2000L) ; myTimer.execute(); } }

輸出如:

任務執行了:Sat Apr 15 15:56:52 CST 2017 任務執行了:Sat Apr 15 15:56:54 CST 2017 任務執行了:Sat Apr 15 15:56:56 CST 2017 任務執行了:Sat Apr 15 15:56:58 CST 2017 任務執行了:Sat Apr 15 15:57:00 CST 2017

當然功能很簡單,但是起碼也學到了點東西。

三、Timer

要知道這麼常用的功能,我都可以實現(比較菜的),Java肯定已經幫我們實現了,那就是Timer類了。

public class TimerTest { public static void main(String[] args) { Timer timer = new Timer(); // 5s後執行 // timer.schedule(new MyTask(), 5000); // 馬上執行任務,每隔1000執行一次 timer.scheduleAtFixedRate(new MyTask(), new Date(), 1000); } } // 定時任務,這是一個執行緒 class MyTask extends TimerTask { @Override public void run() { System.out.println("task execute "); } }

檢視TimerTask原始碼

public abstract class TimerTask implements Runnable { ... }

由上面可以知道,Timer也是基於執行緒來實現的。當然它實現的也更復雜點。

四、Quartz框架

Quartz是一個完全由Java編寫的開源作業排程框架,為在Java應用程式中進行作業排程提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來排程作業。它實現了作業和觸發器的多對多的關係,還能把多個作業與不同的觸發器關聯。

使用如下:

建立job

public class HelloJob implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { JobDetail detail = context.getJobDetail(); String name = detail.getJobDataMap().getString("name"); System.out.println("say hello " + name ); } }

測試

public class QuartzTest { public static void main(String[] args) throws InterruptedException { // 建立工廠 SchedulerFactory schedulerfactory = new StdSchedulerFactory(); Scheduler scheduler = null; try { // 通過schedulerFactory獲取一個排程器 scheduler = schedulerfactory.getScheduler(); // 指明job的名稱,所在組的名稱,以及繫結job類 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("JobName", "JobGroupName") .usingJobData("name", "quartz").build(); // 定義觸發的條件 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup") .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever()) .startNow().build(); // 把作業和觸發器註冊到任務排程中 scheduler.scheduleJob(job, trigger); // 啟動排程 scheduler.start(); Thread.sleep(10000); // 停止排程 scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); } } }

步驟:

  1. 建立job
  2. 建立工廠,獲取排程器
  3. 使用JobBuilder通過job生成jobDetail,可以傳遞資料
  4. 通過TriggerBuilder建立Trigger,可以設定時間
  5. 通過排程器註冊ob和trigger
  6. 啟動排程

五、Quartz和Spring整合

建立job

public class MailJob { private void send() { System.out.println("傳送郵件了:" + new Date()); } }

配置

<description>Quartz配置檔案</description> <!-- 定義一個job --> <bean id="mailJob" class="com.lw.jk.job.MailJob"></bean> <!-- 定義一個 MethodInvokingJobDetailFactoryBean--> <bean id="methodInvokingJobDetailFactoryBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="mailJob"></property> <property name="targetMethod" value="send"></property> </bean> <!-- 指定時間 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="methodInvokingJobDetailFactoryBean"></property> <property name="cronExpression" value="0/10 * * * * ? *"></property> </bean> <!-- 指定排程器 --> <bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>

  •  

輸出如下:

傳送郵件了:Sat Apr 15 16:12:00 CST 2017 傳送郵件了:Sat Apr 15 16:12:10 CST 2017

OK,這篇學習定時器和Quart總結就這樣了。