在spring中你有时候需要在每天或者指定的一个时候进行一系列的操作。这个时候我们的spring为我们提供了一个很好的包来解决这个问题,你这是需要写一个Class文件,在文件中定义你要执行操作的函数你就可以通过配置来达到定时操作了。
1)需要的jar包为:quartz.jar包,将他加到你工程的classpath中去。
2)在applicationContext中配置你的定时发送操作。
(1) 下边定义的这个testQuarz就是我们要将我们的定时操作函数TestDoIt()所要放置的地方。就是说TestDoIt()这个方法是 TestQuarz这个类中的一个函数。这里声明一下这个bean。就是将这个bean注入到我们的容器中。这个时候我们可以在这个bean中引用容器中 其他的bean进行数据库操作。是不是很酷?
代码: |
<bean id="testQuarz" class="cn.demo.test.util.TestQuarz"/> |
(2)下边的这个bean是我们定义要使用哪个bean中的哪个方法作为我们要定时执行的任务。这里定义了我们要使用testQuarz这个bean中的TestDoIt()这个函数作为我们要定时执行的任务。
代码: |
<bean id="quartzDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="testQuarz"/> </property> <property name="targetMethod"> <value>TestDoIt</value> </property> </bean> |
(3)这是一个触发器的bean的设置,在这里我们设置了我们要触发的jobDetail是哪个。这里我们定义了要触发的jobDetail是quartzDetail,并且我们还定义了触发的时间。
代码: |
<bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="quartzDetail"/> </property> <property name="cronExpression"> |
<!-- 每天凌晨1点7分18妙运行定时任务,时间的设置请看下边
更多的配置例子请查看:http://wiki.opensymphony.com/display/QRTZ1/CronTriggers+Tutorial
-->
代码: |
<value>18 7 1 * * ?</value> </property> </bean> |
<!-- 一定要把autowire设置为no,否则它能感知出dataSourse并设置里面的dataSourse的属性-->
(4) 下边的是我们管理这些触发器的总设置,他管理我们我们的触发器列表。据说他的内部是自己建立了自己的数据库来存放自己的临时表,因为我们在我们的配置文件 中自动的配置了dataSource这个bean,我们的每一个bean都会在使用数据库的时候找到他,但是如果我们下边的这个管理bean知道的话就会 把他当成自己的临时数据库,然后就会出错。所以我们需要将下边的数据库感知设置成否定。这样就不影响他内部实现了。我们可以在下边的bean的list中 放置多个触发器。
代码: |
<bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="quartzTrigger"/> </list> </property> </bean> |
到此,我们的定时发送设置就完成了,具体的还要看看spring的refence比较好,那些比较细的细节东东我没有涉及到。
由于项目需要学习了一下定时 触发的功能。
Spring 提供了支持时序调度,对于Quartz Scheduler和Timer两者存在一个方便的类允许你调用目标对象(类似于通常的MethodInvokingFactoryBeans)上的某个方法。
可以灵活定时 调用,bean中的方法。
主要用到 org.spring framework.scheduling.quartz.SimpleTriggerBean 类
<bean id="topDailyTrigger" class="org.spring framework.scheduling.quartz.SimpleTriggerBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="jobDetail" />
<!-- 启动后5秒开始 计时 -->
<property name="startDelay" value="5000" />
<!-- repeat every 一个小时 seconds -->
<property name="repeatInterval" value="3600000" />
</bean>
一个任务 指定执行的bean 和对应的方法
<bean id="jobDetail" class="org.spring framework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="DailyEntryManager" />
<property name="targetMethod" value="excut" />
<property name="concurrent" value="false" />
</bean>
这个是要执行的bean 声明
<bean id="DailyEntryManager" class="net.bokee.dailymodule.service.DailyEntryManagerImpl">
</bean>
最后不要忘记这个配置
<bean class="org.spring framework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="topDailyTrigger" />
</list>
</property>
</bean>
说明:org.spring framework.scheduling.quartz.SchedulerFactoryBean这是一个spring 的工厂bean,在他的triggers属性列表中加入刚才定义的触发器,这里可以定义多个触发器(list嘛)。
下面学习一下 定时 表达式
定时批处理作业是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>
上面这段配置文件规定了在早上6点和晚上8点执行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 | , - * / |