在Spring中,使用JDK的Timer類庫來做任務調度功能不是很方便,關鍵它不可以象cron服務那樣可以指定具體年、月、日、時和分的時間。你只能將時間通過換算成微秒后傳給它。如任務是每天執行一次,則需要在spring中如下配置:
<bean id="scheduledTask" class= "org.springframework.scheduling.timer.ScheduledTimerTask">
<!--程序啟動后開始執行任務的延遲時間 -->
<property name="delay" value="0" />
<!--每隔一天【一天=24×60×60×1000微秒】執行一次-->
<property name="period" value="86400000" />
<!--業務統計報表bean -->
<property name="timerTask" ref="businessReport" />
</bean>
其中period就是一天的微秒數。如果每月1日運行一次,那就復雜了,不知如何配置。因為月份有大、小月之分,每月的微秒數都不一樣。
而Quartz類庫不但有著上述JDK的Timer類庫類似的配置,更重要的,它還有著類似于unix的cron服務的配置。因此,在遷移中我們采用了Quartz類庫的接口。
具體的步驟如下:
1 編寫業務類,該類繼承了org.quartz.Job,主要的邏輯在execute方法中編寫
2 配置spring的applicationContext.xml文件
2.1 配置任務JobDetailBean
2.2配置觸發器 CronTriggerBean
2.3配置調度器 SchedulerFactoryBean
3 所需要的jar包:
spring.jar,quartz.jar,commons-logging-1.0.4.jar,commons-dbcp-1.2.2.jar,commons-pool-1.3.jar
4 把quartz.properties放到類路徑下
以下為一個demo
業務類:
三 quartz.properties文件的內容(默認放在類路徑下)
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
#============================================================================
# Configure ThreadPool
#============================================================================
#org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#============================================================================
# Configure JobStore
#============================================================================
#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.misfireThreshold = 60000
#org.quartz.jobStore.useProperties = false
#org.quartz.jobStore.tablePrefix = QRTZ_
#org.quartz.jobStore.dataSource = myDS
#org.quartz.jobStore.isClustered = true
#org.quartz.jobStore.clusterCheckinInterval = 15000
#============================================================================
# Configure DataSource
#============================================================================
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost/test
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = root
org.quartz.dataSource.myDS.maxConnections = 10
附:cronExpression表達式解釋:
0 0 12 * * ?---------------在每天中午12:00觸發
0 15 10 ? * *---------------每天上午10:15 觸發
0 15 10 * * ?---------------每天上午10:15 觸發
0 15 10 * * ? *---------------每天上午10:15 觸發
0 15 10 * * ? 2005---------------在2005年中的每天上午10:15 觸發
0 * 14 * * ?---------------每天在下午2:00至2:59之間每分鐘觸發一次
0 0/5 14 * * ?---------------每天在下午2:00至2:59之間每5分鐘觸發一次
0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之間的每5分鐘觸發一次
0 0-5 14 * * ?---------------每天在下午2:00至2:05之間每分鐘觸發一次
0 10,44 14 ? 3 WED---------------每三月份的星期三在下午2:00和2:44時觸發
0 15 10 ? * MON-FRI---------------從星期一至星期五的每天上午10:15觸發
0 15 10 15 * ?---------------在每個月的每15天的上午10:15觸發
0 15 10 L * ?---------------在每個月的最后一天的上午10:15觸發
0 15 10 ? * 6L---------------在每個月的最后一個星期五的上午10:15觸發
0 15 10 ? * 6L 2002-2005---------------在2002, 2003, 2004 and 2005年的每個月的最后一個星期五的上午10:15觸發
0 15 10 ? * 6#3---------------在每個月的第三個星期五的上午10:15觸發
0 0 12 1/5 * ?---------------從每月的第一天起每過5天的中午12:00時觸發
0 11 11 11 11 ?---------------在每個11月11日的上午11:11時觸發.
Cron 表達式包括以下 7 個字段:
·秒
·分
·小時
·月內日期
·月
·周內日期
·年(可選字段)
Cron 觸發器利用一系列特殊字符,如下所示:
·反斜線(/)字符表示增量值。例如,在秒字段中“5/15”代表從第 5 秒開始,每 15 秒一次。
·問號(?)字符和字母 L 字符只有在月內日期和周內日期字段中可用。問號表示這個字段不包含具體值。所以,如果指定月內日期,可以在周內日期字段中插入“?”,表示周內日期值無關緊要。字母 L 字符是 last 的縮寫。放在月內日期字段中,表示安排在當月最后一天執行。在周內日期字段中,如果“L”單獨存在,就等于“7”,否則代表當月內周內日期的最后一個實例。所以“0L”表示安排在當月的最后一個星期日執行。
·在月內日期字段中的字母(W)字符把執行安排在最靠近指定值的工作日。把“1W”放在月內日期字段中,表示把執行安排在當月的第一個工作日內。
·井號(#)字符為給定月份指定具體的工作日實例。把“MON#2”放在周內日期字段中,表示把任務安排在當月的第二個星期一。
·星號(*)字符是通配字符,表示該字段可以接受任何可能的值。