JCronTab学习

习惯使用 unix/linux 的开发人员应该对 crontab 都不陌生。Crontab 是一个非常方便的用于 unix/linux 系统的任务调度命令。JCronTab 则是一款完全按照 crontab 语法编写的 java 任务调度工具。
 
首先简单介绍一下 crontab 的语法,与上面介绍的 Quartz 非常相似,但更加简洁 , 集中了最常用的语法。主要由六个字段组成(括弧中标识了每个字段的取值范围):
 


 Minutes (0-59)
 Hours   (0-23)
 Day-of-Month (1-31)
 Month    (1-12/JAN-DEC)
 Day-of-Week  (0-6/SUN-SAT)
 Command
 


与 Quartz 相比,省略了 Seconds 与 Year,多了一个 command 字段,即为将要被调度的命令。JCronTab 中也包含符号“*”与“/”, 其含义与 Quartz 相同。
 
举例如下:
 
每天 12 点到 15 点 , 每隔 1 小时执行一次 Date 命令:
 


 0 12-15/1 * * * Date

 

表达式详解:

 

Minutes(0-59)
 
 Hours(0-23) 
 
Day-of-Month(1-31)
 
 Month(1-12/JAN-DEC)
 
Day-of-Week(0-6/SUN-SAT)
 
Command 
 
时间段/频率
 
时间段/频率
 
时间段/频率
 
时间段/频率
 
时间段/频率
 
类名#方法 参数1 参数2 参数3 …
 
20-40/2
 
2-10/1
 
3-8/4
 
2-12/2
 
MON-WED,SAT
 
*/2 * * * *  com.segsec.gisap.test.JCronTask2#run Hello World
 
表示在20到40分钟的时间段内2分钟执行一次
 
表示2点到10点每1个小时执行
 
表示3号至8号每4天执行一次
 
表示2-12月份每2个月执行一次
 
同一至周三以为周六执行
 
每2分钟执行一次  com.segsec.gisap.test.JCronTask2中的run,参数1=Hello, 参数2=World

 


每月 2 号凌晨 1 点发一封信给 zhjingbj@cn.ibm.com
 


 0 1 2 * * mail -s “good” zhjingbj@cn.ibm.com
 


每周一,周二,周三,周六的晚上 20:00 到 23:00,每半小时打印“normal”:
 


 0/30 20-23 * * MON-WED,SAT echo “normal”
 


JCronTab 借鉴了 crontab 的语法,其区别在于 command 不再是 unix/linux 的命令,而是一个 Java 类。如果该类带参数,例如“com.ibm.scheduler.JCronTask2#run”,则定期执行 run 方法;如果该类不带参数,则默认执行 main 方法。此外,还可以传参数给 main 方法或者构造函数,例如“com.ibm.scheduler.JCronTask2#run Hello World“表示传两个参数 Hello 和 World 给构造函数。
 
JCronTab 与 Quartz 相比,其优点在于,第一,支持多种任务调度的持久化方法,包括普通文件、数据库以及 XML 文件进行持久化;第二,JCronTab 能够非常方便地与 Web 应用服务器相结合,任务调度可以随 Web 应用服务器的启动自动启动;第三,JCronTab 还内置了发邮件功能,可以将任务执行结果方便地发送给需要被通知的人。
 
JCronTab 与 Web 应用服务器的结合非常简单,只需要在 Web 应用程序的 web.xml 中添加如下行:
 
清单 10. 在 web.xml 中配置 JCronTab 的属性
 


    
 <servlet>
   <servlet-name>LoadOnStartupServlet</servlet-name>
   <servlet-class>org.jcrontab.web.loadCrontabServlet</servlet-class>
   <init-param>
 <param-name>PROPERTIES_FILE</param-name>
 <param-value>D:/Scheduler/src/jcrontab.properties</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>
 <!-- Mapping of the StartUp Servlet -->
 <servlet-mapping>
   <servlet-name>LoadOnStartupServlet</servlet-name>
 <url-pattern>/Startup</url-pattern>
 </servlet-mapping>
 


在清单 10 中,需要注意两点:第一,必须指定 servlet-class 为 org.jcrontab.web.loadCrontabServlet,因为它是整个任务调度的入口;第二,必须指定一个参数为 PROPERTIES_FILE,才能被 loadCrontabServlet 识别。
 
接下来,需要撰写 D:/Scheduler/src/jcrontab.properties 的内容,其内容根据需求的不同而改变。
 
当采用普通文件持久化时,jcrontab.properties 的内容主要包括:
 


 org.jcrontab.data.file = D:/Scheduler/src/crontab
 org.jcrontab.data.datasource = org.jcrontab.data.FileSource
 


其中数据来源 org.jcrontab.data.datasource 被描述为普通文件,即 org.jcrontab.data.FileSource。具体的文件即 org.jcrontab.data.file 指明为 D:/Scheduler/src/crontab。
 
Crontab 描述了任务的调度安排:
 


 */2 * * * * com.ibm.scheduler.JCronTask1
 * * * * * com.ibm.scheduler.JCronTask2#run Hello World
 


其中包含了两条任务的调度,分别是每两分钟执行一次 JCronTask1 的 main 方法,每一分钟执行一次 JCronTask2 的 run 方法。
 
清单 11. JcronTask1 与 JCronTask2 的实现
 


    
 package com.ibm.scheduler;

import java.util.Date;

public class JCronTask1 {

 private static int count = 0;

 public static void main(String[] args) {
  System.out.println("--------------Task1-----------------");
  System.out.println("Current Time = " + new Date() + ", Count = "
    + count++);
 }
}

package com.ibm.scheduler;

import java.util.Date;

public class JCronTask2 implements Runnable {

 private static int count = 0;

 private static String[] args;

 public JCronTask2(String[] args) {
  System.out.println("--------------Task2-----------------");
  System.out.println("Current Time = " + new Date() + ", Count = "
    + count++);
  JCronTask2.args = args;
 }

 @Override
 public void run() {
  System.out.println("enter into run method");
  if (args != null && args.length > 0) {
   for (int i = 0; i < args.length; i++) {
         System.out.print("This is arg " + i + " " + args[i] + "\n");
   }
  }
 }
}

 


到此为止,基于普通文件持久化的 JCronTab 的实例就全部配置好了。启动 Web 应用服务器,便可以看到任务调度的输出结果:
 


 --------------Task2-----------------
 Current Time = Tue Feb 15 09:22:00 CST 2011, Count = 0
 enter into run method
 This is arg 0 Hello
 This is arg 1 World
 --------------Task1-----------------
 Current Time = Tue Feb 15 09:22:00 CST 2011, Count = 0
 --------------Task2-----------------
 Current Time = Tue Feb 15 09:23:00 CST 2011, Count = 1
 enter into run method
 This is arg 0 Hello
 This is arg 1 World
 --------------Task2-----------------
 Current Time = Tue Feb 15 09:24:00 CST 2011, Count = 2
 enter into run method
 This is arg 0 Hello
 This is arg 1 World
 --------------Task1-----------------
 Current Time = Tue Feb 15 09:24:00 CST 2011, Count = 1
 


通过修改 jcrontab.properties 中 datasource,可以选择采用数据库或 xml 文件持久化,感兴趣的读者可以参考 进阶学习 JCronTab。
 
此外,JCronTab 还内置了发邮件功能,可以将任务执行结果方便地发送给需要被通知的人。其配置非常简单,只需要在 jcontab.properties 中添加几行配置即可:
 


 org.jcrontab.sendMail.to= Ther email you want to send to
 org.jcrontab.sendMail.from=The email you want to send from
 org.jcrontab.sendMail.smtp.host=smtp server
 org.jcrontab.sendMail.smtp.user=smtp username
 org.jcrontab.sendMail.smtp.password=smtp password 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值