java定時器實現總結

來源:互聯網
上載者:User

標籤:jdk   extends   com   err   高效   trigger   啟動   sql資料庫   mysql   

前言:Java定時器目前主要有3種實現方式:JDK組件,Spring Task,Quartz架構。

 

1. JDK組件
(1) java.util.TimerTask


MyTimerTask.java:

public class MyTimerTask extends TimerTask {  @Override  public void run() {    System.out.println("MyTimerTask, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));  }  public static void main(String[] args) {    Timer timer = new Timer();    timer.schedule(new MyTimerTask(), 1000, 1000);    //timer.cancel(); //停止調度器  }}

(2) java.util.concurrent.ScheduledThreadPoolExecutor(JDK5.0+之後推薦使用)


MyScheduledTask.java:

public class MyScheduledTask implements Runnable {  public void run() {    System.out.println("my scheduled task, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));  }}

MyScheduledExecutor.java:

public class MyScheduledExecutor {  public static void main(String[] args) {    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);    ScheduledFuture future = executor.scheduleWithFixedDelay(new MyScheduledTask(), 1000, 1000, TimeUnit.MILLISECONDS);    //future.cancel(true); // 停止定時任務,Timer不能停止定時任務,只能關閉調度器    //executor.shutdown(); // 關閉調度器  }}

比較:java.util.concurrent.ScheduledThreadPoolExecutor比java.util.TimerTask更加靈活和高效。


2. Spring Task
(1) 配置方式實現
TaskJob.java:

@Servicepublic class TaskJob {  public void job1() {    System.out.println("指定Spring定時任務1, now: " + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date()));  }}

spring.xml:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:task="http://www.springframework.org/schema/task"...xsi:schemaLocation="...http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd">  <!-- 自動注入定時工作群組件 -->  <context:component-scan base-package="xxx" />  <!-- 定義定時任務調度策略 -->  <task:scheduled-tasks>    <task:scheduled ref="taskJob" method="job1" cron="0/1 * * * * ?" />  </task:scheduled-tasks></beans>

(2) 註解方式實現
TaskJob2.java:

@Componentpublic class TaskJob2 {  /**  * 每隔一秒執行一次  */  @Scheduled(cron="0/1 * * * * ?")  public void job2() {    System.out.println("註解方式使用spring定時任務架構, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));  }}

spring.xml:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:task="http://www.springframework.org/schema/task"...xsi:schemaLocation="...http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd">  <!-- 自動注入定時工作群組件 -->  <context:component-scan base-package="xxx" />  <!-- 啟動註解方式的定時任務 -->  <task:annotation-driven /></beans>

 

3. Quartz
Quartz是一個開源的,功能非常豐富的定時器架構,詳見:http://www.quartz-scheduler.org/。
Quartz可以獨立使用,也可以整合在Spring架構中,詳見:http://projects.spring.io/spring-framework/。

(1) 獨立使用Quartz(詳見Quartz官方樣本):
pom.xml:

<dependencies>  <dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz</artifactId>    <version>2.2.1</version>  </dependency>  <dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz-jobs</artifactId>    <version>2.2.1</version>  </dependency></dependencies>

定義定時任務,MyJob.java:

public class MyJob implements Job {  public void execute(JobExecutionContext arg0) throws JobExecutionException {    System.out.println("執行Quartz定時任務實現, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));  }}

調度定時任務,MyJobSheduler:

public class MyJobSheduler {  public static void main(String[] args) {    try {      JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob").build();      Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
                .build();      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();      scheduler.scheduleJob(job, trigger);      scheduler.start();      } catch (SchedulerException e) {        e.printStackTrace();      }    }}

 

(2) Spring整合Quartz
如:http://docs.spring.io/spring/docs/5.0.0.M4/spring-framework-reference/htmlsingle/#scheduling-quartz 。

 

【實現比較】

實現方式 優點 缺點
JDK組件 無需引入第三方依賴,控制靈活 僅支援簡單任務調度,不支援指定日期等複雜定時任務
Spring Task 功能相對JDK方式全面(簡單或指定日期等複雜任務調度),支援註解和配置2種方式 Spring 3.x及以上版本才支援,詳見: http://www.springframework.org/schema/task,且無法靈活控制任務啟動或停止。
Quartz  開源,功能全面且強大(簡單或指定日期等複雜任務調度),可獨立使用,也可以與Spring整合 必須在項目中引入quartz依賴 在項目中必須引入quartz依賴。

 

【使用總結】
1. J2EE項目
    -- 未依賴Spring架構,建議使用Quartz。
    -- 引入了Spring 3.x+,如果僅需要簡單定時任務控制,建議使用Spring Task;否則建議使用Quartz。
    -- 特別地,在Spring Boot項目中,根據需求可以靈活選擇JDK,Spring Task或者Quartz。

2. 非J2EE項目
    -- 簡單定時任務控制,建議使用JDK實現:java.util.concurrent.ScheduledThreadPoolExecutor;否則建議使用Quartz。

 

附:Linux crontab

在Linux環境下,可以直接使用crontab程式實現簡單的定時任務,比如定時全量備份MySQL資料庫。
詳見:https://wiki.archlinux.org/index.php/Cron_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

 

【參考】
http://gong1208.iteye.com/blog/1773177                            Spring定時任務的幾種實現
http://www.cnblogs.com/liuyitian/p/4108391.html                Spring cron 運算式
http://blog.csdn.net/ethanzhao/article/details/4406017       Linux crontab 命令格式與詳細例子

 

java定時器實現總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.