Jcrontab - java定时程序进阶学习
2012-05-06 09:29
281 查看
初学Jcrontab感觉非常好,用它来做一个定时程序非常容易,而且方便。有关Jcrontab的介绍和它的定时文件的格式,在前面的那篇文章已经介绍过了,这里再来讲解一下它在程序中的具体应用。在这里,我们先约定数据源这个概念,“数据源”(我暂且这样称呼),它主要是用来由Jcrontab按照定时规则要处理的类和程序,这可以是多个,也可以是一个,我按照Jcrontab提供的方法通常是将它写到文件中,XML文件或数据库中。这样,按照Jcrontab的规则,提供给Jcrontab这些数据源就可以使用Jcrotab的定时功能了。
根据Jcrontab存储的不同的数据源,我们可以分成以下几个:
普通文件来存储
数据库存储
XML文件存储
在程序中也可以添加要执行的数据源,比如执行本地的应用程序等。下面分别介绍一下。在这之前,先介绍一下有关Jcrontab用到的配置文件:
jcrontab.properties配置文件,这是用来启动Jcrontab的必需文件。在Jcrontab的发布包中已经有一个完整格式的jcrontab.properties文件了,里面有它的样例,我们只需要根据我们自己的应用需要,来使用具体的配置属性,来构造自己的jcrontab.properties。
还有一个配置文件就是我们自己的定时配置文件。(若我们采用的数据源是文件的话,就需要这个了)这个文件是用来写负责处理定时程序的,里面按照规定好的时间来处理规定好的类或类的方法。
若我们采用数据库存储数据源的话,那么,我们就需要配置一个数据库的信息,在jcrontab.properties文件中已经有一个例子了,我们可以改成我们需要的数据库配置信息,这个很容易。
若要采用的是XML形式的文件,那么我们要指定数据源是XML的,同时指定处理XML的解析器,这里用的是Apache的Xerces。
在程序中随时可以添加数据源,通过Crontab中的newTask方法,就可以随时添加。
通过文件记录数据源
下面通过例子,我们来讲解一个具体的Jcrontab程序,看它是如何定时处理程序的。
运行程序的JCrontabApp类: JCrontabApp类
带测试运行的NumTest类和LetterTest类:
NumTest类
配置文件Jcrontab.properties:
Jcrontab.properties文件
处理定时程序的crontab文件:
crontab文件
然后,我们在命令行输入jcrontab.properties文件的位置,和要处理的类型,这里,我们选filedata,接着运行该类,我们就可以看到它的执行结果:
[2004-10-19 16:10:20,500 LV:DEBUG CL:jcrontab] Interval to sleep : 39984
[2004-10-19 16:11:00,484 LV: INFO CL:jcrontab] com.aweb.test.NumTest#
[2004-10-19 16:11:00,484 LV: INFO CL:jcrontab] com.aweb.test.LetterTest#
[2004-10-19 16:11:00,484 LV:DEBUG CL:jcrontab] Interval to sleep : 60000
Time:1098173460484 i= 0
Time:1098173460484 i= 1
Time:1098173460484 i= 2
Time:1098173460484 i= 3
Time:1098173460484 i= 4
Time:1098173460484 i= 5
Time:1098173460484 i= 6
Time:1098173460500 i= 7
Time:1098173460500 i= 8
Time:1098173460500 i= 9
Time: 1098173460515 Letter: hello World!
这样每隔一分钟,就会运行一次NumTest类和LetterTest类
通过数据库记录数据源
在进行数据库的操作前,你需要在数据库中建一张表,这个表在Jcrontab中有它的SQL语句,events表,它的表结构,可以参考Jcrontab提供的SQL语句。我们只需要将crontab文件中的属性做一下修改就可以了
修改后的crontab文件: crontab文件
增加下面的属性:
通过XML来存储数据源
其实和文件存储差不多,主要这里要用到XML的解析器,这里用的是Apache Xerces来处理的,其它的都一样。
修改后的crontab文件: crontab文件
去掉原来的crontab文件中的信息,加上下面的属性
定时处理程序,还可以用来处理本地的应用程序
根据系统的不同,可以处理不同的应用程序,比如:执行ping的命令,那么你就可以调用Jcrontab中已经写好的NativeExec类来执行即可。它主要负责处理本地系统上的应用程序。我们在XML文件中添加一条记录,就可以实现了。
修改后的crontab文件: crontab.xml文件
通过Email来发送执行的数据源
在Jcrontab中提供了JavaMail的功能,你可以用JavaMail来实现上面同样的功能。你只需要修改一下配置文件
修改后的crontab文件: crontab文件
增加下面的属性
总结:Jcrontab提供的定时处理程序的功能不单单是这些,还可以定时处理EJB等高级的组件,在应用服务器中也可以采用Servlet的方式来定时处理(个人感觉:它提供的用Servlet来定时处理程序的功能不太好!大家去慢慢体会吧!)。还有一些其它方面的功能,还需要继续的学习和探索!
根据Jcrontab存储的不同的数据源,我们可以分成以下几个:
普通文件来存储
数据库存储
XML文件存储
在程序中也可以添加要执行的数据源,比如执行本地的应用程序等。下面分别介绍一下。在这之前,先介绍一下有关Jcrontab用到的配置文件:
jcrontab.properties配置文件,这是用来启动Jcrontab的必需文件。在Jcrontab的发布包中已经有一个完整格式的jcrontab.properties文件了,里面有它的样例,我们只需要根据我们自己的应用需要,来使用具体的配置属性,来构造自己的jcrontab.properties。
还有一个配置文件就是我们自己的定时配置文件。(若我们采用的数据源是文件的话,就需要这个了)这个文件是用来写负责处理定时程序的,里面按照规定好的时间来处理规定好的类或类的方法。
若我们采用数据库存储数据源的话,那么,我们就需要配置一个数据库的信息,在jcrontab.properties文件中已经有一个例子了,我们可以改成我们需要的数据库配置信息,这个很容易。
若要采用的是XML形式的文件,那么我们要指定数据源是XML的,同时指定处理XML的解析器,这里用的是Apache的Xerces。
在程序中随时可以添加数据源,通过Crontab中的newTask方法,就可以随时添加。
通过文件记录数据源
下面通过例子,我们来讲解一个具体的Jcrontab程序,看它是如何定时处理程序的。
运行程序的JCrontabApp类: JCrontabApp类
import org.jcrontab.Crontab; import org.jcrontab.NativeExec; import org.jcrontab.SendMail; import org.jcrontab.data.CrontabParser; import org.jcrontab.data.CrontabEntryBean; import org.jcrontab.data.CrontabEntryDAO; import java.io.File; public class JCrontabApp { private static Crontab cron = null; private String JcrontabFile = null; public JCrontabApp() { } public String getJcrontabFile() { return JcrontabFile; } public void setJcrontabFile(String jcrontabFile) { JcrontabFile = jcrontabFile; } /** * 初始化Jcrontab,通过指定的jcrontab.properties来执行具体的操作 * 启动Jcrontab */ protected void init() { cron = Crontab.getInstance(); try { ShutdownHook(); cron.setDaemon(false); if (null == JcrontabFile) cron.init(); cron.init(JcrontabFile); System.out.println("Start Jcrontab..."); } catch (java.lang.Exception e) { e.printStackTrace(); } } /** * 关闭Jcrontab的执行 * @throws Exception */ protected void ShutdownHook() throws Exception { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { System.out.println("Shutting down..."); cron.uninit(200); System.out.println("Stoped Jcrontab!"); } }); } /** * 判断是否是Holiday * @return * @throws Exception */ public boolean isHoliday()throws Exception{ return cron.isHoliday(); } /** * 根据不同的参数执行不同的定时程序,可选参数可从main方法中查看 * @param args * @throws Exception */ public void exectue(String[] args) throws Exception { if (args.length < 2) { return; } this.setJcrontabFile(args[0]); init(); if ("database".equals(args[1])) executeDatabase(); else if ("appliction".equals(args[1])) { String[] parameters = new String[args.length-2]; System.arraycopy(args,2,parameters,0,args.length-2); cron.newTask("org.jcrontab.NativeExec","main",parameters); } else if ("javamail".equals(args[1])) executeJavaMail(args[2]); } /** * 执行数据库的操作 * @throws Exception */ protected void executeDatabase() throws Exception { CrontabParser cp = new CrontabParser(); CrontabEntryBean[] ceb = new CrontabEntryBean[2]; ceb[0] = cp.marshall("* * * * * com.aweb.test.NumTest 123"); ceb[0].setYears("*"); ceb[0].setSeconds("0"); ceb[0].setBusinessDays(true); ceb[0].setId(0); ceb[1] = cp.marshall("* * * * * com.aweb.test.LetterTest 234"); ceb[1].setYears("*"); ceb[1].setSeconds("0"); ceb[1].setBusinessDays(true); ceb[1].setId(1); CrontabEntryDAO.getInstance().store(ceb); } /** * 执行本地的应用程序的操作 * @param parameters */ protected void executeAppliction(String[] parameters) { NativeExec.main(parameters); } /** * 将执行的文件发送为email * @param sendFilename * @throws Exception */ protected void executeJavaMail(String sendFilename) throws Exception { File sendFile = new File(sendFilename); SendMail sm = new SendMail(); sm.send(sendFile); } /** * 主要通过main方法来实现Jcrontab的实现 * @param args * @throws Exception */ public static void main(String args[]) throws Exception { if (args.length < 2) { System.out.println("Usage:The values of args:<-type>[]"); System.out.println("********************************************************"); System.out.println("Optional Parameters of type:"); System.out.println("-filedata:doing file operating."); System.out.println("-database:doing database operating."); System.out.println("-appliction :doing native application execute."); System.out.println("-javamail :doing javamail operating."); System.out.println("********************************************************"); System.exit(1); } JCrontabApp jp = new JCrontabApp(); jp.exectue(args); System.out.println(jp.isHoliday()); } }
带测试运行的NumTest类和LetterTest类:
NumTest类
public class NumTest { public static void main(String args[]){ for(int i=0;i<10;i++){ System.out.println("Time:"+System.currentTimeMillis()+" i= "+i); } } }LetterTest类
public class LetterTest { public static void main(String args[]) { System.out.println("Time: " + System.currentTimeMillis() + " Letter: " + "hello World!"); } }
配置文件Jcrontab.properties:
Jcrontab.properties文件
## #Mon May 24 19:12:24 CEST 2004 org.jcrontab.version=2.0.RC1 org.jcrontab.log.Logger=org.jcrontab.log.Log4JLogger org.jcrontab.log.log4J.Properties=log4j.properties org.jcrontab.data.file = crontab org.jcrontab.data.datasource = org.jcrontab.data.FileSource org.jcrontab.Crontab.refreshFrequency = 3
处理定时程序的crontab文件:
crontab文件
* * * * * com.aweb.test.NumTest * * * * * com.aweb.test.LetterTest
然后,我们在命令行输入jcrontab.properties文件的位置,和要处理的类型,这里,我们选filedata,接着运行该类,我们就可以看到它的执行结果:
[2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.log.log4J.Properties : log4j.properties [2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.version : 2.0.RC1 [2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.Crontab.refreshFrequency : 3 [2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.data.file : crontab.properties [2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.data.datasource : org.jcrontab.data.FileSource [2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.log.Logger : org.jcrontab.log.Log4JLogger Start Jcrontab...
[2004-10-19 16:10:20,500 LV:DEBUG CL:jcrontab] Interval to sleep : 39984
[2004-10-19 16:11:00,484 LV: INFO CL:jcrontab] com.aweb.test.NumTest#
[2004-10-19 16:11:00,484 LV: INFO CL:jcrontab] com.aweb.test.LetterTest#
[2004-10-19 16:11:00,484 LV:DEBUG CL:jcrontab] Interval to sleep : 60000
Time:1098173460484 i= 0
Time:1098173460484 i= 1
Time:1098173460484 i= 2
Time:1098173460484 i= 3
Time:1098173460484 i= 4
Time:1098173460484 i= 5
Time:1098173460484 i= 6
Time:1098173460500 i= 7
Time:1098173460500 i= 8
Time:1098173460500 i= 9
Time: 1098173460515 Letter: hello World!
这样每隔一分钟,就会运行一次NumTest类和LetterTest类
通过数据库记录数据源
在进行数据库的操作前,你需要在数据库中建一张表,这个表在Jcrontab中有它的SQL语句,events表,它的表结构,可以参考Jcrontab提供的SQL语句。我们只需要将crontab文件中的属性做一下修改就可以了
修改后的crontab文件: crontab文件
增加下面的属性:
org.jcrontab.data.GenericSQLSource.driver = org.gjt.mm.mysql.Driver org.jcrontab.data.GenericSQLSource.url = jdbc:mysql://127.0.0.1/netbook org.jcrontab.data.GenericSQLSource.username = root org.jcrontab.data.GenericSQLSource.password = org.jcrontab.data.datasource = org.jcrontab.data.GenericSQLSource这样,我们再在命令行下输入jcrontab.properties文件的位置,和要处理的类型,这里,我们选database,就可以执行我们写好的两个类了。运行时,它是先将这两个待处理的类的数据源,按照规定好的数据库中的字段,一一存入数据库中,然后再从数据库中读取events表中的每一行(这每一行就是待处理的数据源),它就根据这些行定时处理。执行的结果同上。
通过XML来存储数据源
其实和文件存储差不多,主要这里要用到XML的解析器,这里用的是Apache Xerces来处理的,其它的都一样。
修改后的crontab文件: crontab文件
去掉原来的crontab文件中的信息,加上下面的属性
org.jcrontab.data.file = crontab.xml org.xml.sax.driver=org.apache.xerces.parsers.SAXParser org.jcrontab.data.datasource=org.jcrontab.data.XMLSource同样在命令行下输入jcrontab.properties文件的位置,和要处理的类型,这里和文件的一样选filedata,来运行该类,执行结果同上。
定时处理程序,还可以用来处理本地的应用程序
根据系统的不同,可以处理不同的应用程序,比如:执行ping的命令,那么你就可以调用Jcrontab中已经写好的NativeExec类来执行即可。它主要负责处理本地系统上的应用程序。我们在XML文件中添加一条记录,就可以实现了。
修改后的crontab文件: crontab.xml文件
<?xml version="1.0" encoding="GB2312"?> <CRONTAB> <SECONDS>0</SECONDS> <MINUTES>*</MINUTES> <HOURS>*</HOURS> <DAYSOFMONTH>*</DAYSOFMONTH> <MONTHS>*</MONTHS> <DAYSOFWEEK>*</DAYSOFWEEK> <YEARS>*</YEARS> <BUSSINESDAYS>true</BUSSINESDAYS> <STARTDATE>null</STARTDATE> <ENDDATE>null</ENDDATE> <CLASS>com.aweb.test.NumTest</CLASS> <method>main</method> <DESCRIPTION>null</DESCRIPTION> </CRONTABENTRY> <CRONTABENTRY id=1> <SECONDS>0</SECONDS> <MINUTES>*</MINUTES> <HOURS>*</HOURS> <DAYSOFMONTH>*</DAYSOFMONTH> <MONTHS>*</MONTHS> <DAYSOFWEEK>*</DAYSOFWEEK> <YEARS>*</YEARS> <BUSSINESDAYS>true</BUSSINESDAYS> <STARTDATE>null</STARTDATE> <ENDDATE>null</ENDDATE> <CLASS>com.aweb.test.LetterTest</CLASS> <method>main</method> <DESCRIPTION>null</DESCRIPTION> </CRONTABENTRY> <CRONTABENTRY id=2> <SECONDS>0</SECONDS> <MINUTES>*</MINUTES> <HOURS>*</HOURS> <DAYSOFMONTH>*</DAYSOFMONTH> <MONTHS>*</MONTHS> <DAYSOFWEEK>*</DAYSOFWEEK> <YEARS>*</YEARS> <BUSSINESDAYS>true</BUSSINESDAYS> <STARTDATE>null</STARTDATE> <ENDDATE>null</ENDDATE> <CLASS>org.jcrontab.NativeExec</CLASS> <method>main</method> <PARAMETERS>net send 192.168.0.109 "你好!每一分钟出现一次!呵呵"</PARAMETERS> <DESCRIPTION>null</DESCRIPTION> </CRONTABENTRY> </CRONTAB>这样执行的结果就是每隔一分钟就会执行一次net send命令(是不是装了个定时炸弹呀!呵呵,不过是在服务器端才运行的哟!)。
通过Email来发送执行的数据源
在Jcrontab中提供了JavaMail的功能,你可以用JavaMail来实现上面同样的功能。你只需要修改一下配置文件
修改后的crontab文件: crontab文件
增加下面的属性
<A href="mailto:org.jcrontab.SendMail.to=yourname@sohu.com">org.jcrontab.SendMail.to=yourname@sohu.com</A> <A href="mailto:org.jcrontab.SendMail.from=myname@sohu.com">org.jcrontab.SendMail.from=myname@sohu.com</A> org.jcrontab.SendMail.smtp.host=smtp.sohu.com org.jcrontab.SendMail.smtp.username= yourname org.jcrontab.SendMail.smtp.password=password这样它就会将执行的数据源发送到你的邮箱中。不过,目前这个我没有测试成功,我认为主要是由于邮件服务器的原因吧,它总是出现JavaMail的运行异常。程序方面应该不会有问题,这需要我在以后的学习中继续来完成,也希望大家帮我实现这个功能!
总结:Jcrontab提供的定时处理程序的功能不单单是这些,还可以定时处理EJB等高级的组件,在应用服务器中也可以采用Servlet的方式来定时处理(个人感觉:它提供的用Servlet来定时处理程序的功能不太好!大家去慢慢体会吧!)。还有一些其它方面的功能,还需要继续的学习和探索!
相关文章推荐
- Jcrontab - java定时程序进阶学习-Java基础-Java-编程开发
- java学习(1) 第一个java小程序运行解释
- Java学习6 面向对象编程进阶
- java编程思想学习笔记(6)--手动创建、编译、运行Java程序
- JavaEE进阶知识学习-----Java8新特性知识学习-1-Lambda表达式
- java程序性能优化学习总结--第一章java性能调优概述
- java 程序运行原理和基础概念学习
- Java进阶学习第十八天——事物与连接池
- 在java中用定时功能操作一下程序!
- java学习——java基础(八)之java进阶及新特性
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_常用查询>(二十二)
- 黑马程序员—Java程序入门学习日记-基础篇1
- MySQL快速入门(一)—Java进阶学习第十五天
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<JDBC>(二十四)
- [学习笔记]java基础Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行
- java 学习笔记(入门篇)_java程序helloWorld
- Java学习第一篇 Java程序运行机制和jvm
- (十一)java.io.File学习进阶及separator、pathSeparator分隔符简介
- 黑马程序员-JAVA学习第7课-Java程序与其它进程的数据通信
- 学习使用eclipse编写Java程序