Spring定时任务
1. 首先把spring.jar包放到classpath下
2. 编辑spring配制文件,ApplicationContext.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" > <beans> <!—要调度的对象--> <bean id="testQuarz" class="springtimer.TestQuarz" /> <!--定义定时执行testQuarz 这个bean中的sayHello()方法--> <bean id="helloworldTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="testQuarz" /> </property> <property name="targetMethod"> <value>sayHello</value> </property> </bean> <!--触发器的bean的设置,在这里我们设置了我们要触发的jobDetail是哪个。这里我们定义了要触发的jobDetail是helloworldTask,即触发器去触发哪个bean..并且我们还定义了触发的时间:每天5:17pm--> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean=" helloworldTask " /> </property> <property name="cronExpression"> <!-- 关键在配置此表达式 --> <value>0 17 17 * * ?</value> </property> </bean> <!--管理触发器的总设置,管理我们的触发器列表,可以在bean的list中放置多个触发器。 --> <bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="cronTrigger" /> </list> </property> </bean> </beans>
3.以下是被调度的类代码
package springtimer; public class TestQuarz { public void sayHello() { System.out.println("HelloWorld! "); } }
4,提供测试类
public class TestHello { public static void main(String[] args) { // 只要加载配置文件就可以了, ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); System.out.println("*****完毕******"); }
5,Ok自已可以设置sping-config文件中<value>0 17 17 * * ?</value>的调度表达式,可以测试啦!
6, 下面简单的介绍一下cron expressions(调度表达式)
Field Name | Mandatory? | Allowed Values | Allowed Special Characters Seconds | YES | 0-59 | , - * / Minutes | YES | 0-59 | , - * / Hours | YES | 0-23 | , - * / Day of month | YES | 1-31 | , - * ? / L W C Month | YES | 1-12 or JAN-DEC | , - * / Day of week | YES | 1-7 or SUN-SAT | , - * ? / L C # Year | NO | empty, 1970-2099 | , - * /
下面介绍一下定时服务时间的配置,也可以为以后做备忘:
表达式意义:
秒0-59,-*/
分0-59,-*/
小时0-23,-*/
日期1-31,-*?/LWC
月份1-12或者JAN-DEC,-*/
星期1-7或者SUN-SAT,-*?/LC#
年(可选)留空,1970-2099,-*/
例子:
"0012**?"每天中午12点触发
"01510?**"每天上午10:15触发
"01510**?"每天上午10:15触发
"01510**?*"每天上午10:15触发
"01510**?2005"2005年的每天上午10:15触发
"0*14**?"在每天下午2点到下午2:59期间的每1分钟触发
"00/514**?"在每天下午2点到下午2:55期间的每5分钟触发
"00/514,18**?"在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"00-514**?"在每天下午2点到下午2:05期间的每1分钟触发
"010,4414?3WED"每年三月的星期三的下午2:10和2:44触发
"01510?*MON-FRI"周一至周五的上午10:15触发
"0151015*?"每月15日上午10:15触发
"01510L*?"每月最后一日的上午10:15触发
"01510?*6L"每月的最后一个星期五上午10:15触发
"01510?*6L2002-2005"2002年至2005年的每月的最后一个星期五上午10:15触发
"01510?*6#3"每月的第三个星期五上午10:15触发
每天早上6点
06***
每两个小时
0*/2***
晚上11点到早上8点之间每两个小时,早上八点
023-7/2,8***
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0114*1-3
1月1日早上4点
0411*
特殊字符说明:
"*"字符被用来指定所有的值。如:"*"在分钟的字段域里表示"每分钟"。
"?"字符只在日期域和星期域中使用。它被用来指定"非明确的值"。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。
月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号(?)来表明不想设置那个字段
"-"字符被用来指定一个范围。如:"10-12"在小时域意味着"10点、11点、12点"。
","字符被用来指定另外的值。如:"MON,WED,FRI"在星期域里表示"星期一、星期三、星期五".
"/"字符用来指定具体的增量。如"0/15"在秒中的配置表示"从0秒开始每隔15秒",即"0,15,30,45"。
如"5/15"在秒中的配置表示"从5秒开始每隔15秒",即"5,20,35,50"。"*/5"和"0/5"是一个效果。
L是‘last’的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,
例如day-of-month域中表示一个月的最后一天,如果在day-of-week域表示‘7’或者‘SAT’,
如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五。