天天看點

Java定時器(二)之Spring定時任務、Quartz實作Java定時器(二)之Spring定時任務、Quartz實作

spring定時器(基于xml)

spring定時器(基于注解)

quartz定時器

1、使用基于xml配置的spring定時器

首先編寫定時任務類Mytask

<b>[java]</b> view plain copy

public class Mytask {

  public void execute(){

  System.out.println("基于xml配置的spring定時任務!");

 }

}

接着在spring配置檔案中加入xmlns:task="http://www.springframework.org/schema/task"命名空間

<b>[html]</b> view plain copy

&lt;task:annotation-driven/&gt;

&lt;bean id="mytask" class="com.pptv.vipbackend.controller.Mytask"/&gt;

&lt;task:scheduled-tasks&gt;

&lt;task:scheduled ref="mytask" cron="*/5 * * * * ?" method="print"/&gt;&lt;!--每隔5秒執行一次--&gt;

&lt;/task:scheduled-tasks&gt;

當然,定時任務類要加入spring的管理中

&lt;context:component-scan base-package="com.simonsfan.study.controller.Mytask"&gt;

執行便可看到效果

2、使用基于注解配置的spring定時器

基于注解會相對簡單的多,直接編寫任務類Mytask:

@EnableScheduling

@Component

  @Scheduled(cron = "*/5 * * * * ?")

    System.out.println("基于注解配置的spring定時任務!");

  }

當然,任務類也要納入spring管理

啟動可以看到相同效果

3、quartz定時器,其性能和靈活性都優于jdk的TimerTask類

pom檔案中加入

&lt;dependency&gt;

&lt;groupId&gt;org.quartz-scheduler&lt;/groupId&gt;

&lt;artifactId&gt;quartz&lt;/artifactId&gt;

&lt;version&gt;2.2.2&lt;/version&gt;

&lt;/dependency&gt;

定時任務類Mytask:

  public void execute() {

    System.out.println("基于spring+quartz實作定時任務!");;

spring配置檔案中加入:

&lt;bean id="jobBean" class="com.pptv.vipbackend.controller.Mytask"/&gt;

&lt;bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt;

&lt;property name="targetObject"&gt;

&lt;ref bean="jobBean"/&gt;

&lt;/property&gt;

&lt;property name="targetMethod"&gt;

&lt;value&gt;execute&lt;/value&gt;&lt;!--任務類中的方法名--&gt;

&lt;!--将并發設定為false--&gt;

&lt;property name="concurrent" value="false" /&gt;

&lt;/bean&gt;

&lt;bean id="simpleTrigger"

class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"&gt;

&lt;property name="jobDetail" ref="myJobDetail" /&gt;

&lt;property name="startDelay" value="1000" /&gt;

&lt;property name="repeatInterval" value="2000" /&gt;

&lt;!-- 總管理類如果将lazy-init='false'那麼容器啟動就會執行排程程式 --&gt;

&lt;bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no"&gt;

&lt;property name="triggers"&gt;

&lt;list&gt;

&lt;!--作業排程器,list下可加入其他的排程器--&gt;

&lt;ref bean="simpleTrigger" /&gt;

&lt;/list&gt;

這樣,基于spring + quartz便可實作定時任務的排程

定時任務中的時間表達式:

順序:

分鐘

小時

日期

月份

星期

年(可選)

取值:

0-59

0-23

1-30(31)

1-12

1-7

允許特殊字元:

, - * /

, - * / ? L W C

, - * / L # C

1970-2099 , - * /

字段含義

*:代表所有可能的值

-:指定範圍

,:列出枚舉  例如在分鐘裡,"5,15"表示5分鐘和20分鐘觸發

/:指定增量  例如在分鐘裡,"3/15"表示從3分鐘開始,沒隔15分鐘執行一次

?:表示沒有具體的值,使用?要注意沖突

L:表示last,例如星期中表示7或SAT,月份中表示最後一天31或30,6L表示這個月倒數第6天,FRIL表示這個月的最後一個星期五

W:隻能用在月份中,表示最接近指定天的工作日

#:隻能用在星期中,表示這個月的第幾個周幾,例如6#3表示這個月的第3個周五

0 * * * * ? 每1分鐘觸發一次

0 0 * * * ? 每天每1小時觸發一次

0 0 10 * * ? 每天10點觸發一次

0 * 14 * * ? 在每天下午2點到下午2:59期間的每1分鐘觸發

0 30 9 1 * ? 每月1号上午9點半

0 15 10 15 * ? 每月15日上午10:15觸發

*/5 * * * * ? 每隔5秒執行一次

0 */1 * * * ? 每隔1分鐘執行一次

0 0 5-15 * * ? 每天5-15點整點觸發

0 0/3 * * * ? 每三分鐘觸發一次