java定時任務實現的幾種方式

摘要:    在開發測試工具的應用後臺,常常聽到同事說要作個定時任務把作日誌處理,或者數據清理,包括作些複雜的業務計算邏輯,在選擇定時任務的時候,怎麼可以快速實現,而且選擇一種更適合本身的方式呢? 我這裏把定時任務的實現收集整理了一些方法,但願能夠幫到剛開始作定時任務的同窗,寫得不對的地方請指正。 一 java

   在開發測試工具的應用後臺,常常聽到同事說要作個定時任務把作日誌處理,或者數據清理,包括作些複雜的業務計算邏輯,在選擇定時任務的時候,怎麼可以快速實現,而且選擇一種更適合本身的方式呢? 我這裏把定時任務的實現收集整理了一些方法,但願能夠幫到剛開始作定時任務的同窗,寫得不對的地方請指正。

spring

一  Java 基本的定時任務,總結方法有三種:markdown

      1.1   建立一個thread,而後讓它在while循環裏一直運行着,經過sleep方法來達到定時任務的效果;
      併發

1.2   用Timer和TimerTask與第一種方法相比有以下好處:工具

  • 當啓動和去取消任務時能夠控制測試

  • 第一次執行任務時能夠指定你想要的delay時間線程

 1.3   用ScheduledExecutorService是從的java.util.concurrent裏,作爲併發工具類被引進的,這是最理想的定時任務實現方式,相比於上兩個方法,它有如下好處:3d

  • 相比於Timer的單線程,它是經過線程池的方式來執行任務的日誌

  • 能夠很靈活的去設定第一次執行任務delay時間component

  • 提供了良好的約定,以便設定執行的時間間隔


二  Spring 定時任務,總結方式也有三種:

  2.1    ScheduledTimerTask:  Spring的ScheduledTimerTask定義了一個定時器任務的運行週期,遺憾的是,你能夠指定任務執行的頻度,但你沒法精確指定它什麼時候運行,這就須要用到第二種Quartz進行任務調度;

  •        建立一個業務任務,在Spring配置文件中聲明 ;

  •        在Spring 配置文件中,配置ScheduledTimerTask ,而且關聯上自定義的任務實例;

  •        啓動定時器,Spring的TimerFactoryBean負責啓動定時任務

 
  

 2.2    使用 Quartz:

  •       首先仍是老樣子定義業務邏輯任務:

在Spring中聲明而且配置做業調度的觸發方式


這裏 Quartz的做業觸發器有兩種,分別是

org.springframework.scheduling.quartz.SimpleTriggerBean

org.springframework.scheduling.quartz.CronTriggerBean

 

第一種SimpleTriggerBean,只支持按照必定頻度調用任務,如每隔一段時間運行一次。

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  

    <property name="jobDetail" ref="myJob" />  

    <property name="startDelay" value="0" /><!-- 調度工廠實例化後,通過0秒開始執行調度 -->  

    <property name="repeatInterval" value="2000" /><!-- 每2秒調度一次 -->  

</bean> 

 

第二種CronTriggerBean,支持到指定時間運行一次,如天天12:00運行一次,如上配置;

  • 配置調度工廠

org.springframework.scheduling.quartz.SchedulerFactoryBean,代碼如上;

  • 啓動你的應用便可

 2.3   使用 Spring-Task

         Spring自帶的定時任務工具,spring task,能夠將它比做一個輕量級的Quartz,並且使用起來很簡單,除spring相關的包外不須要額外的包,並且支持註解和配置文件兩種:

         第一步:編寫任務類;TaskJob,method job1  --代碼省略

         第二步:在spring配置文件頭中添加命名空間及描述

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:task="http://www.springframework.org/schema/task"   

    xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 

        第三步:spring配置文件中設置具體的任務

<task:scheduled-tasks>   

        <task:scheduled ref="taskJob" method="job1" cron="0 * * * * ?"/>   

</task:scheduled-tasks>  

<context:component-scan base-package="com.alibaba.mytask" /> 

說明:ref參數指定的即任務類,method指定的即須要運行的方法,cron及cronExpression表達式,具體寫法這裏不介紹了,<context:component-scan base-package="com.alibaba.mytask" />spring掃描註解用的。

 

from: https://yq.aliyun.com/articles/2368

相關文章
相關標籤/搜索