定时批处理作业是J2EE企业应用里很重要的一环,用来在晚间进行财务挂账,数据转存,新闻联播等等操作。
而在Spring里,已经很好的集成了Quartz,简单到像配cron一样,在xml文件里面配一下时间就可以自动执行,不需要写一行代码。Spring对Quartz大刀阔斧的简化堪称范例,Quartz项目组也许可以学习一下。
<bean id="methodInvokingJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"><ref bean="financeDAO"/></property>
<property name="targetMethod"><value>confirmOrder</value></property>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail"/>
</property>
<property name="cronExpression">
<value>0 0 6,12,20 * * ?</value>
</property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref local="cronTrigger"/></list>
</property>
</bean>
上面这段配置文件规定了执行financeDAO对象的confirmOrder()方法.
附:cronExpression配置说明
字段 | 允许值 | 允许的特殊字符 | ||
---|---|---|---|---|
秒 | 0-59 | , - * / | ||
分 | 0-59 | , - * / | ||
小时 | 0-23 | , - * / | ||
日期 | 1-31 | , - * ? / L W C | ||
月份 | 1-12 或者 JAN-DEC | , - * / | ||
星期 | 1-7 或者 SUN-SAT | , - * ? / L C # | ||
年(可选) | 留空, 1970-2099 | , - * / |
“*”字符被用来指定所有的值。如:”*“在分钟的字段域里表示“每分钟”。
“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。
月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号(?)来表明不想设置那个字段
“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。
“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”.
The '/' character is used to specify increments. For example "0/15" in the seconds field means "the seconds 0, 15, 30, and 45". And "5/15" in the seconds field means "the seconds 5, 20, 35, and 50". Specifying '*' before the '/' is equivalent to specifying 0 is the value to start with. Essentially, for each field in the expression, there is a set of numbers that can be turned on or off. For seconds and minutes, the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to 31, and for months 1 to 12. The "/" character simply helps you turn on every "nth" value in the given set. Thus "7/6" in the month field only turns on month "7", it does NOT mean every 6th month, please note that subtlety.
L是‘last’的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天,
如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个
星期五,
The 'W' character is allowed for the day-of-month field. This character is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month". So if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify "1W" as the value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not 'jump' over the boundary of a month's days. The 'W' character can only be specified when the day-of-month is a single day, not a range or list of days
.
The 'L' and 'W' characters can also be combined for the day-of-month expression to yield 'LW', which translates to "last weekday of the month".
The '#' character is allowed for the day-of-week field. This character is used to specify "the nth" XXX day of the month. For example, the value of "6#3" in the day-of-week field means the third Friday of the month (day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of the month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the given day-of-week in the month, then no firing will occur that month.
The 'C' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "calendar". This means values are calculated against the associated calendar, if any. If no calendar is associated, then it is equivalent to having an all-inclusive calendar. A value of "5C" in the day-of-month field means "the first day included by the calendar on or after the 5th". A value of "1C" in the day-of-week field means "the first day included by the calendar on or after sunday".
关于cronExpression的介绍:
- 字段 允许值 允许的特殊字符
- 秒 0 - 59 , - * /
- 分 0 - 59 , - * /
- 小时 0 - 23 , - * /
- 日期 1 - 31 , - * ? / L W C
- 月份 1 - 12 或者 JAN-DEC , - * /
- 星期 1 - 7 或者 SUN-SAT , - * ? / L C #
- 年(可选) 留空, 1970 - 2099 , - * /
- 表达式意义
- "0 0 12 * * ?" 每天中午 12 点触发
- "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 点到下午 2 : 59 期间的每 1 分钟触发
- "0 0/5 14 * * ?" 在每天下午 2 点到下午 2 : 55 期间的每 5 分钟触发
- "0 0/5 14,18 * * ?" 在每天下午 2 点到 2 : 55 期间和下午 6 点到 6 : 55 期间的每 5 分钟触发
- "0 0-5 14 * * ?" 在每天下午 2 点到下午 2 : 05 期间的每 1 分钟触发
- "0 10,44 14 ? 3 WED" 每年三月的星期三的下午 2 : 10 和 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 年至 2005 年的每月的最后一个星期五上午 10 : 15 触发
- "0 15 10 ? * 6#3" 每月的第三个星期五上午 10 : 15 触发
- 每天早上6 点
- 0 6 * * *
- 每两个小时
- 0 */ 2 * * *
- 晚上11 点到早上 8 点之间每两个小时,早上八点
- 0 23 - 7 / 2 , 8 * * *
- 每个月的4 号和每个礼拜的礼拜一到礼拜三的早上 11 点
- 0 11 4 * 1 - 3
- 1 月 1 日早上 4 点
- 0 4 1 1 *
quartz的高级特性不仅如此
1 数据库存储
2 集群支持
3 数据库持久化任务,trigger
4 trigger 的停止,运行
5 任务的任意添加
6 比corntrigger 更详尽的任务安排
7 线程的内部数据交换