Java定時器和Quartz使用


一、Java普通自定義定時器

 1 /**
 2  *  自定義一個定時器
 3  * @author lw
 4  */
 5 public class MyTimer extends Thread{
 6 
 7     private Long time ;
 8 
 9     public MyTimer(Long time) {
10         this.time = time;
11     }
12 
13     @Override
14     public void run() {
15         while(true){
16             try {
17                 Thread.sleep(time);
18             } catch (InterruptedException e) {
19                 e.printStackTrace();
20             }
21             send();
22         }
23     }
24     /**
25      *  開始執行任務
26      */
27     public void execute(){
28         this.start();
29     }
30 
31     /**
32      *  定時任務
33      */
34     private void send() {
35         System.out.println("任務執行了:" + new Date());
36     }
37 
38     public static void main(String[] args) {
39         MyTimer myTimer = new MyTimer(2000L) ;
40         myTimer.execute();
41     }
42 
43 }

 

輸出內容:

 1 任務執行了:Tue Nov 13 10:10:02 CST 2018
 2 任務執行了:Tue Nov 13 10:10:04 CST 2018
 3 任務執行了:Tue Nov 13 10:10:06 CST 2018
 4 任務執行了:Tue Nov 13 10:10:08 CST 2018
 5 任務執行了:Tue Nov 13 10:10:10 CST 2018
 6 任務執行了:Tue Nov 13 10:10:12 CST 2018
 7 任務執行了:Tue Nov 13 10:10:14 CST 2018
 8 任務執行了:Tue Nov 13 10:10:16 CST 2018
 9 任務執行了:Tue Nov 13 10:10:18 CST 2018
10 任務執行了:Tue Nov 13 10:10:20 CST 2018

 

二、使用Java   Timer類

 1 public class TimerTest {
 2 
 3     public static void main(String[] args) {
 4         Timer timer = new Timer();
 5         // 5s后執行
 6         // timer.schedule(new MyTask(), 5000);
 7         // 馬上執行任務,每隔1000執行一次
 8         timer.scheduleAtFixedRate(new MyTask(), new Date(), 1000);
 9     }
10 
11 }
12 
13 // 定時任務,這是一個線程
14 class MyTask extends TimerTask {
15     @Override
16     public void run() {
17         System.out.println("task execute ");
18     }
19 }

Timer也是基於線程來實現的。

三、Quartz框架

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

使用如下:

創建job

1 public class HelloJob implements Job{
2 
3     public void execute(JobExecutionContext context) throws JobExecutionException {
4         JobDetail detail = context.getJobDetail(); 
5         String name = detail.getJobDataMap().getString("name");
6         System.out.println("say hello " + name );
7     }
8 
9 }

 

測試

 1 public class QuartzTest {
 2 
 3     public static void main(String[] args) throws InterruptedException {
 4 
 5         // 創建工廠
 6         SchedulerFactory schedulerfactory = new StdSchedulerFactory();
 7         Scheduler scheduler = null;
 8         try {
 9             // 通過schedulerFactory獲取一個調度器
10             scheduler = schedulerfactory.getScheduler();
11 
12             // 指明job的名稱,所在組的名稱,以及綁定job類
13             JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("JobName", "JobGroupName")
14                     .usingJobData("name", "quartz").build();
15             // 定義觸發的條件
16             Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup")
17                     .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever())
18                     .startNow().build();
19 
20             // 把作業和觸發器注冊到任務調度中
21             scheduler.scheduleJob(job, trigger);
22 
23             // 啟動調度
24             scheduler.start();
25 
26             Thread.sleep(10000);
27 
28             // 停止調度
29             scheduler.shutdown();
30 
31         } catch (SchedulerException e) {
32             e.printStackTrace();
33         }
34 
35     }
36 }

步驟:

  1. 創建job
  2. 創建工廠,獲取調度器
  3. 使用JobBuilder通過job生成jobDetail,可以傳遞數據
  4. 通過TriggerBuilder創建Trigger,可以設置時間
  5. 通過調度器注冊ob和trigger
  6. 啟動調度

四、Quarts 和 Spring整合

創建job

1 public class MailJob {
2 
3     private void send() {
4         System.out.println("發送郵件了:" + new Date()); 
5     }
6 }

 

配置

 1 <description>Quartz配置文件</description>
 2     <!-- 定義一個job -->
 3     <bean id="mailJob" class="com.lw.jk.job.MailJob"></bean>
 4     <!-- 定義一個 MethodInvokingJobDetailFactoryBean-->
 5     <bean id="methodInvokingJobDetailFactoryBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 6         <property name="targetObject" ref="mailJob"></property>
 7         <property name="targetMethod" value="send"></property>
 8     </bean>
 9     <!-- 指定時間 -->
10     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
11         <property name="jobDetail" ref="methodInvokingJobDetailFactoryBean"></property>
12         <property name="cronExpression" value="0/10 * * * * ? *"></property>
13     </bean> 
14 
15     <!-- 指定調度器 -->
16     <bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
17         <property name="triggers">
18             <list>
19                 <ref bean="cronTrigger"/>
20             </list>
21         </property>
22     </bean>

 

輸出結果:

1 發送郵件了:Sat Apr 15 16:12:00 CST 2017
2 發送郵件了:Sat Apr 15 16:12:10 CST 2017

 

四、spring 自帶的定時任務:spring-task

spring 自身的spring-task 不依賴任何的第三方框架,實現方式也很簡單:

這里需要做的就是在xml文件中的引入task命名空間,以便后續標簽中的使用:

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task 
 http://www.springframework.org/schema/task/spring-task-3.2.xsd

1:定義任務類:

1 public class TaskJob {
2 
3     public void springJob(){
4         System.out.println("spring 自身的定時任務");
5     }
6 }

2:在xml配置文件中配置定時job:

1    <!--配置任務類-->
2     <bean id="beanA" class="bz.beppe.javase.TaskJob"></bean>  
3     <!--定義觸發類和觸發方式-->
4     <task:scheduled-tasks scheduler="myScheduler">
5         <task:scheduled ref="beanA" method="springJob" fixed-rate="5000"/>
6     </task:scheduled-tasks>
7 
8     <task:scheduler id="myScheduler" pool-size="10"/>

經過這樣的配置后在在開啟這個定時任務的spring容器后就會開始相應的定時job。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM