jCrontab 简介与实现
来源:互联网 发布:二手手机估价软件 编辑:程序博客网 时间:2024/05/19 08:40
它是由Java语言编写的日程处理程序,它目的是提供强大的定时处理功能,让我们的应用程序可以按照提供的时间表来执行不同的应用。Jcrontab的特点
1、在指定的时间表中可执行Classes/Threads/main/EJB/Methods/NativePrograms等应用。
2、提供完全按照Unix的UNIX-POSIX crontab的格式来规定时间。
3、可存储或读取由文件,数据字典,或通过数据源链接的数据库的信息。
4、可将执行结果通过电子邮件来查看
5、非常容易的可以和Web应用服务器结合,Tomcat, Resin, Jetty and Jboss这些服务器已经通过测试和应用,这一切只需要在web.xml中添加load-on-startup直接指定Jcrontab下的loadCrontabServlet,就可以了。
6、它的设计和部署是高性能并可扩展的。
http://www.open-open.com/open14114.htm
SECTION 01 定时启动器 scheduler
使用 UNIX-POSIX Open System 的人应该都对 crontab 不陌生, 或者使用 windows 的系统的人对于"计划任务" 也不陌生, 这一些, 定时启动器(scheduler), 就是让你设定在某些固定的时间去启动一些预设的程序.
当系统管理员或个人设定 crontab 的时候, cron 这个程序会去检查, 当条件符合, 就命令系统自动执行某些排定的程序, 相同的 jcrontab 与 quartz 都是纯 java 所写的, 通常如果你是 on 在 server 上, 你可以选择 jcrontab, 例如重新启动 server, 清除 cache 等等工作. 另外, quartz 可以很轻易地和 application 结合. 各有各的优点 ^^~
SECTION 02 jCrontab 简介与实现
jcrontab 目前有提供存取文件或数据库, 把执行结果寄发 email, 简单地设置在 Tomcat, Resin, Jetty 及 JBoss 之上, 更是可以取代 cron 单独去执行, 也提供了良好的效能 ^^~
下载位置 jcrontab on sourceforge.net
基本上, 我拿放在 tomcat 的例子来解释, 在 web.xml 中设置
<!-- This is the loadOnStartupServlet in order to launch jcrontab with the application server --><servlet><servlet-name>LoadOnStartupServlet</servlet-name><servlet-class>org.jcrontab.web.loadCrontabServlet</servlet-class><!-- can overwrite the parameters from jcrontab.properties --><!-- simply adding here the right parameters --><init-param><param-name>org.jcrontab.data.file</param-name><param-value>c:/tomcat4/webapps/jcrontab/WEB-INF/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>
至于 jcrontab.properties 的设置, 就可以决定你的 cron 的属性要去哪里取 crontab 资料# 这是设置你的 crontab 数据来源 文件类 org.jcrontab.data.file = c:/tomcat4/webapps/jcrontab/WEB-INF/crontaborg.jcrontab.data.datasource = org.jcrontab.data.FileSourceorg.jcrontab.Crontab.refreshFrequency = 3# 这是设置你的 crontab 数据来源 数据库类 postgesql #org.jcrontab.data.GenericSQLSource.driver = org.postgresql.Driver#org.jcrontab.data.GenericSQLSource.url = jdbc:postgresql://yourmachine.jcrontab.org:5432/jcrontab# 这是设置你的 crontab 数据来源 数据库类 mysql #org.jcrontab.data.GenericSQLSource.driver = org.gjt.mm.mysql.Driver#org.jcrontab.data.GenericSQLSource.url = jdbc:mysql://yourmachine.jcrontab.org:3306/jcrontab#org.jcrontab.data.GenericSQLSource.username = iolalla#org.jcrontab.data.GenericSQLSource.password = yourpassword#org.jcrontab.data.datasource = org.jcrontab.data.GenericSQLSource#org.jcrontab.data.GenericSQLSource.dbDataSource=yourDS# 这是设置你的 crontab 处理完要发信给谁 #org.jcrontab.sendMail.to=iolalla@yahoo.com#org.jcrontab.sendMail.from=jcrontab@yoursystem.com#org.jcrontab.sendMail.smtp.host=smtp.yahoo.com#org.jcrontab.sendMail.smtp.user= yourSMTPusername#org.jcrontab.sendMail.smtp.password=yourSMTPpassword# 这是设置你的 crontab Logger 模式 #org.jcrontab.log.Logger=jcrontabplugin.jEditLoggerorg.jcrontab.log.Logger=org.jcrontab.log.Log4JLoggerorg.jcrontab.log.log4J.Properties=c:/tomcat4/webapps/jcrontab/WEB-INF/log4j.properties#org.jcrontab.data.FileOpener=file# 这是设置你的 crontab 参考的假日文件 #org.jcrontab.data.holidaysource=org.jcrontab.data.HoliDayFileSource#org.jcrontab.data.holidaysfilesource={$HOME}.jcrontab/holidays#To change this plz refer to java.text.SimpleDateFormat#org.jcrontab.data.dateFormat=dd/MM/yyyy
至于, cron 这个文件设置的方法和 unix-like 的 crontab 文件是一样的, 大家可以参考去查询, 类似以下这样, 代表每半小时, 或奇数时候就会执行30 1,3,5,7,9,11,13,15,17,19,21,23 * * * org.jcrontab.tests.TaskTest2 halfOddHours
如果要采用数据库, 一定要建立 events 这个 tableCREATE TABLE events (second VARCHAR(64) DEFAULT '0',minute VARCHAR(64) DEFAULT '*', hour VARCHAR(64) DEFAULT '*',dayofmonth VARCHAR(64) DEFAULT '*',month VARCHAR(64) DEFAULT '*', dayofweek VARCHAR(64) DEFAULT '*',year VARCHAR(64) DEFAULT '*',task VARCHAR(255),extrainfo VARCHAR(255),businessDays VARCHAR(6) DEFAULT 'true');
当所有环境设置完成后, 接著, 你就可以在 web.xml 设置是否启动 jcrontab 帮你作工作排程, 如果你没有设置 load-on-startup, 可以通过手动启动 by /Startup, 至于你要设置其它的, 例如 email, 也可以在 cron 那个文件处理一下 ^^~SECTION 03 Quartz 的简介与范例
相对于 jcrontab, Quartz 算是更完整的一个项目, 随著开发的版本上来, 他已经脱离只是写在程序里面的计时器, 在指定的时间或区间, 处理所指定的事件. 也加入了 servlet, 可以在 jsp/servlet container 执行.
下载位置 quartz on partnet
在当初, Quartz 的写法就比较单纯, 需要先通过 SchedulerFactory 产生 Scheduler, 接著制定 JobDetail, JobDetail 就是写工作项目,影响群组及执行程序, 接著制定 Trigger 来设置执行此工作项目的时间或区间.
下面这个范例程序码, 最重要的是
SimpleTrigger( java.lang.String name,
java.lang.String group,
java.util.Date startTime, //开始时间, new Date() 代表马上执行
java.util.Date endTime, //结束时间, null 代表不设定结束
int repeatCount, // 重复执行次数, 0 代表不重复执行
long repeatInterval) // 重复执行时间间隔, 0 代表连续执行
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); Scheduler sched = schedFact.getScheduler(); sched.start(); JobDetail jobDetail = new JobDetail("myJob", sched.DEFAULT_GROUP, DumbJob.class); SimpleTrigger trigger = new SimpleTrigger("myTrigger", sched.DEFAULT_GROUP, new Date(), null, 0, 0L); sched.scheduleJob(jobDetail, trigger);
上面这一段是介绍 SimpleTrigger, 他是专门处理重复性执行的工作触发器, 而Quartz 也有提供 CronTrigger 是专门处理设置时间的工作触发器 ,Cron 的小小说明表示方式意义"0 0 12 * * ?"Fire at 12pm (noon) every day"0 15 10 ? * *"Fire at 10:15am every day"0 15 10 * * ?"Fire at 10:15am every day"0 15 10 * * ? *"Fire at 10:15am every day"0 15 10 * * ? 2005"Fire at 10:15am every day during the year 2005"0 * 14 * * ?"Fire every minute starting at 2pm and ending at 2:59pm, every day"0 0/5 14 * * ?"Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day"0 0/5 14,18 * * ?"Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day"0 0-5 14 * * ?"Fire every minute starting at 2pm and ending at 2:05pm, every day"0 10,44 14 ? 3 WED"Fire at 2:10pm and at 2:44pm every Wednesday in the month of March."0 15 10 ? * MON-FRI"Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday"0 15 10 15 * ?"Fire at 10:15am on the 15th day of every month"0 15 10 L * ?"Fire at 10:15am on the last day of every month"0 15 10 ? * 6L"Fire at 10:15am on the last Friday of every month"0 15 10 ? * 6L"Fire at 10:15am on the last Friday of every month"0 15 10 ? * 6L 2002-2005"Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005"0 15 10 ? * 6#3"Fire at 10:15am on the third Friday of every month
所以你可以将表示法放入 cronExpression API 之中
CronTrigger( java.lang.String name,
java.lang.String group,
java.lang.String jobName,
java.lang.String jobGroup,
java.lang.String cronExpression)
接著, 他就能在你指定的时间, 处理你要执行的工作项目, 此外, 你也可以通过 org.quartz.ee.* 处理目前提供的 jmx.jboss, jta 等等 server 端程序, servlet.QuartzInitializerServlet 也可以部署在 jsp/servlet container, 在 util 也有 weblogic 的 sub-package. 最重要的你也可以设置休假日,
HolidayCalendar cal = new HolidayCalendar(); cal.addExcludedDate( someDate ); sched.addCalendar("myHolidays", cal, false); SimpleTrigger trigger = new SimpleTrigger("myTrigger", sched.DEFAULT_GROUP, new Date(), null, SimpleTrigger.REPEAT_INDEFINITELY, 60L * 1000L); trigger.setCalendarName("myHolidays"); // .. schedule job with trigger SimpleTrigger trigger2 = new SimpleTrigger("myTrigger", sched.DEFAULT_GROUP, new Date(), null, 5, 5L * 24L * 60L * 60L * 1000L); trigger2.setCalendarName("myHolidays"); // .. schedule job with trigger2
SECTION 04 scheduler
我偶而会遇到客户有需求希望在夜间寄发文件成功或失败的通知, 因此, 如果我们对于 scheduler 熟悉的话, 这就不会太难了 ^^~ 参考 -- 相关书目或相关文章
- partNet Quartz:
http://www.part.net/quartz_features.html - jCrontab:
http://jcrontab.sourceforge.net/index.shtml
- 2003/07/16 - Velocity Tools 1.0 Released
- jCrontab 简介与实现
- jCrontab 简介与实现
- Jcrontab Research
- JCronTab学习
- MD5简介与代码实现
- base64简介与代码实现
- MD5简介与代码实现
- RMI简介、实现与注意事项
- MD5简介与代码实现
- JNI 简介与实现-JavaNativeInterface
- kafka实现原理与简介
- 二维码的简介与实现
- 网络爬虫简介与实现
- 进阶学习Jcrontab
- jcrontab和Quartz
- 进阶学习Jcrontab
- 进阶学习Jcrontab
- jcrontab学习理解笔记
- 全面分析EJB编程式事务管理(bmt)和声明式事务管理(cmt)(四)——参考网址
- protected的范围及private static的理解
- 内存管理2get_vm_area
- 第一章 概述
- 如何防止代码腐烂
- jCrontab 简介与实现
- 励志经典语录
- 2.21-顺序表就地逆转
- MYSQL常用命令
- window下python 2.6安装MySQLdb的问题
- POWERSHELL-在不同的实例和数据库执行SQL
- ZSD_PAYER_NEW(创建付款方)
- 单链表
- struts2验证框架将验证信息输出到指定位置