`
simonyq
  • 浏览: 23665 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

jcrontab & quartz

阅读更多

 

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/crontab
org.jcrontab.data.datasource = org.jcrontab.data.FileSource
org.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.jEditLogger
org.jcrontab.log.Logger=org.jcrontab.log.Log4JLogger
org.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 這個 table

CREATE 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 熟悉的話, 這就不會太難了 ^^~
 
參考 -- 相關書目或相關文章

  1. partNet Quartz:
    http://www.part.net/quartz_features.html
  2. jCrontab:
    http://jcrontab.sourceforge.net/index.shtml

评论
1 楼 spacefly 2009-02-25  
顶 ......

相关推荐

    jcrontab 实现等价的quartz从数据库获取定时任务方案

    1、从数据库中获取定时任务执行; 2、在数据库中修改定时任务后,执行任务也可以更新(刷新间隔时间); 3、适应于spring 于quartz不能...6、更多jcrontab相关知识,请在网上搜索,附件旨在提供一个可以用的示例demo 。

    jCrontab-用于定时调度的示例

    在实际项目中,jCrontab常与Spring、Quartz等框架结合使用,实现更复杂的任务调度需求。例如,通过Spring的Job和Trigger接口,可以方便地将jCrontab任务纳入Spring容器统一管理,实现任务的生命周期控制。 **5. ...

    java定时任务

    在Java中,实现定时任务的方法多种多样,其中Quartz是一个广泛应用的开源作业调度框架,它提供了丰富的功能来创建、调度和管理任务。 Quartz是一个完全由Java编写的开源作业调度框架,它可以用来在Java应用程序中...

    运用Spring框架实现简单调度

    当前很多开源项目也提供了比较全面的调度功能,如quartz、jcrontab、JobServer等,在这里我介绍一种比较简单的调度,没有quartz那么复杂,目的在于实用就行,这种调度就是spring提供的调度功能,该调度功能基于...

    Java调度原理及使用.docx

    在Java中,有多种方式可以实现任务调度,包括基础的`Timer`类、`ScheduledExecutorService`接口以及第三方库如Quartz和JCronTab。 首先,我们来看`Timer`类。`Timer`是最简单的任务调度实现,它基于单线程模型,...

    几种任务调度的用法

    本文将详细介绍几种常见的任务调度技术及其在Java中的实现方式,包括`Timer`、`ScheduledExecutor`、`Quartz`以及`JCronTab`。通过对比这些技术的特点,旨在帮助开发者选择最适合自身需求的任务调度方案。 #### ...

    几种任务调度的_Java_实现方法与比较

    本文旨在深入探讨几种常见的任务调度在Java中的实现方式,包括`Timer`、`ScheduledExecutor`、开源工具包`Quartz`以及`JCronTab`,并对其特性进行对比分析,以帮助开发者根据具体需求选择最适合的方案。 #### Timer...

    Java调度原理及使用

    在Java中,有多种方式可以实现任务调度,包括`Timer`、`ScheduledExecutor`以及开源库如`Quartz`和`JCronTab`。 首先,`Timer`类是Java早期提供的定时任务调度器。它的使用非常直观,如代码清单1所示,通过`Timer`...

    几种任务调度的Java实现方法与比较

    除了标准库提供的工具外,还有一些第三方库也广泛用于任务调度,其中 `Quartz` 和 `JCronTab` 是两个非常流行的选择。 - **Quartz**:提供了非常强大的调度功能,支持复杂的时间表达式和触发器,适用于需要高度定制...

    Spring3.0作业调度

    此外,还有诸如Quartz、Flux Scheduler和jcrontab等第三方Java作业调度框架。 在Spring 2.x版本中,Spring已经提供了对`Timer`和Quartz的集成支持,通过`FactoryBean`进行配置,还包含线程池调度的抽象类,隐藏了...

Global site tag (gtag.js) - Google Analytics