TimerTask 和 Quartz比较

TimerTask 和 Quartz比较精确度和功能  Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。Quartz拥有TimerTask所有的功能,而TimerTask则没有。 任务类的数量  TimerTask和Quartz每次执行任务时,每次调用的是不是都是同一个任务类对象,还是每次都不一样?现在做如下实验,每次执行任务时,将任务类对象本身打印出来。 

精确度和功能

   Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。Quartz拥有TimerTask所有的功能,而TimerTask则没有。

 

任务类的数量

    TimerTask和Quartz每次执行任务时,每次调用的是不是都是同一个任务类对象,还是每次都不一样?现在做如下实验,每次执行任务时,将任务类对象本身打印出来。

 

Quartz任务类

 

Java代码  
收藏代码

  1. public class MyJob extends QuartzJobBean {  
  2.     private String sTest;  
  3.   
  4.     @Override  
  5.     protected void executeInternal(JobExecutionContext job)  
  6.             throws JobExecutionException {  
  7.         // TODO Auto-generated method stub  
  8.         System.out.println(“sTest = “ + sTest);  
  9.         System.out.println(“MyJob Run…” + this);  
  10.     }  
  11.   
  12.     // set/get 略  
  13.       
  14. }  

Quartz输出结果

 

Java代码  
收藏代码

  1. sTest = 10  
  2. MyJob Run…com.hry.spring.timertask.MyJob@1060478  
  3. sTest = 10  
  4. MyJob Run…com.hry.spring.timertask.MyJob@db4fa2  
  5. sTest = 10  
  6. MyJob Run…com.hry.spring.timertask.MyJob@491c4c  

 

从输出结果可以看出,Quartz每次执行都创建一个新的任务类对象。

 

 

TimerTask任务类

 

Java代码  
收藏代码

  1. public class EmailReportTask extends TimerTask{     
  2.     // 每次执行过程中num的值都会发生变化,说明此事使用的是同一个类对象  
  3.     private int num = 0;  
  4.     @Override     
  5.     public void run() {     
  6.         System.out.println(“num = “ + num++);  
  7.         System.out.println(this);  
  8.     }       
  9. }    

 

TimerTask任务类的输出结果

 

Java代码  
收藏代码

  1. num = 0  
  2. com.hry.spring.timertask.EmailReportTask@1581593  
  3. PageReportTask Run…  
  4. num = 1  
  5. com.hry.spring.timertask.EmailReportTask@1581593  
  6. PageReportTask Run…  

 从输出结果可以看出,TimerTask每次执行时,都是使用同一个对象

 从以上的分析,可以得出结论:Quartz每次执行任务都创建一个新的任务类对象,而TimerTask则每次使用同一个任务类对象。

 

对异常的处理

一个循环执行的任务,如果某一次执行任务时,因为某些原因抛出异常,则定时器是否还会在下一个执行任务的时间点执行任务吗?下面通过模拟在任务类中抛出异常,来模拟这种情况,并测试两种定时器如何处理这种情况。

Quartz任务类

 

Java代码  
收藏代码

  1. public class MyJob extends QuartzJobBean {  
  2.     private String sTest;  
  3.   
  4.     @Override  
  5.     protected void executeInternal(JobExecutionContext job)  
  6.             throws JobExecutionException {  
  7.         // TODO Auto-generated method stub  
  8.         System.out.println(“sTest = “ + sTest);  
  9.         System.out.println(“MyJob Run…” + this);  
  10.         throw new RuntimeException(“Test”);  
  11.     }  
  12.   
  13.     // set/get 方法略  
  14.       
  15. }  

 

 

Quartz输出结果

 

Html代码  
收藏代码

  1. sTest = 10  
  2. MyJob Run…com.hry.spring.timertask.MyJob@16f25a7  
  3. 2013-01-05 19:58:37,381 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-3] ERROR [org.quartz.core.JobRunShell] – Job DEFAULT.reportJob threw an unhandled Exception:   
  4.   java.lang.RuntimeException: Test  
  5.     at com.hry.spring.timertask.MyJob.executeInternal(MyJob.java:24)  
  6.     at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113)  
  7.     at org.quartz.core.JobRunShell.run(JobRunShell.java:223)  
  8.     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)  
  9. 2013-01-05 19:58:37,396 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-3] ERROR [org.quartz.core.ErrorLogger] – Job (DEFAULT.reportJob threw an exception.  
  10.   org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.RuntimeException: Test]  
  11.     at org.quartz.core.JobRunShell.run(JobRunShell.java:234)  
  12.     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)  
  13. Caused by: java.lang.RuntimeException: Test  
  14.     at com.hry.spring.timertask.MyJob.executeInternal(MyJob.java:24)  
  15.     at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113)  
  16.     at org.quartz.core.JobRunShell.run(JobRunShell.java:223)  
  17.     … 1 more  
  18. sTest = 10  
  19. MyJob Run…com.hry.spring.timertask.MyJob@110c31  
  20. 2013-01-05 19:58:39,381 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-4] ERROR [org.quartz.core.JobRunShell] – Job DEFAULT.reportJob threw an unhandled Exception:   
  21.   java.lang.RuntimeException: Test  
  22.     at com.hry.spring.timertask.MyJob.executeInternal(MyJob.java:24)  
  23.     at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113)  
  24.     at org.quartz.core.JobRunShell.run(JobRunShell.java:223)  
  25.     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)  
  26. 2013-01-05 19:58:39,396 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-4] ERROR [org.quartz.core.ErrorLogger] – Job (DEFAULT.reportJob threw an exception.  
  27.   org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.RuntimeException: Test]  
  28.     at org.quartz.core.JobRunShell.run(JobRunShell.java:234)  
  29.     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)  
  30. Caused by: java.lang.RuntimeException: Test  
  31.     at com.hry.spring.timertask.MyJob.executeInternal(MyJob.java:24)  
  32.     at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113)  
  33.     at org.quartz.core.JobRunShell.run(JobRunShell.java:223)  
  34.     … 1 more  

  以上结果中多次出现

Java代码  
收藏代码

  1. sTest = 10    
  2. MyJob Run…com.hry.spring.timertask.MyJob@110c31   

可以看出,尽管每次执行任务时,任务类都会抛出异常,但是Quartz定时器,依然在下一个任务执行时间点执行任务,并没有因为异常,而导致定时器关闭,不再执行循环任务。

 

TimerTask任务类

 

Java代码  
收藏代码

  1. public class EmailReportTask extends TimerTask{     
  2.     // 每次执行过程中num的值都会发生变化,说明此事使用的是同一个类对象  
  3.     private int num = 0;  
  4.     @Override     
  5.     public void run() {     
  6.         System.out.println(“num = “ + num++);  
  7.         throw new RuntimeException(“test”);  
  8.     }       
  9. }     

 

TimerTask输出结果

 

Java代码  
收藏代码

  1. num = 0  
  2. Exception in thread “org.springframework.scheduling.timer.TimerFactoryBean#0” java.lang.RuntimeException: test  
  3.     at com.hry.spring.timertask.EmailReportTask.run(EmailReportTask.java:11)  
  4.     at java.util.TimerThread.mainLoop(Unknown Source)  
  5.     at java.util.TimerThread.run(Unknown Source)  

 TimerTask抛出异常后,后续再也没有执行此任务了,并且定时器所在的线程也自动结束。

 

通过以上的分析,可以知道Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务;而TimerTask则不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务

今天的文章TimerTask 和 Quartz比较分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/10315.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注