Spring Quartz是一個強大的定時任務處理方式。
1、需要的Jar
quartz-1.8.5.jar
commons-logging.jar
spring-core-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring.transaction-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
2.配置文件
這裡配置你要在什麼時候執行你的定時任務,執行的是什麼方法,如下面是在2016.11.10 23:00:00,執行com.seewoedu.train.quartz.GenerateRewardListTask的generate方法,這裡使用cron指定了執行的時間,相關語法可查看 http://www.linuxidc.com/Linux/2016-11/137524.htm
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 啟動觸發器的配置開始 --> <bean name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="myJobTrigger" /> </list> </property> </bean> <!-- 啟動觸發器的配置結束 --> <!-- quartz-2.x的配置 --> <bean id="myJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="myJobDetail" /> </property> <property name="cronExpression"> <!--<value>10 0/1 * * * ?</value>--> <!-- Cron表達式“10 */1 * * * ?”意為:從10秒開始,每1分鐘執行一次。 --> <value>0 0 9 10 12 ? 2016</value> <!-- Cron表達式“0 0 23 10 11 ? 2016”意為:只在2016.11.10 23:00:00 執行。 --> </property> </bean> <!-- 調度的配置結束 --> <!-- job的配置開始 --> <bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="myJob" /> </property> <property name="targetMethod"> <value>generate</value> </property> </bean> <!-- job的配置結束 --> <!-- 工作的bean --> <bean id="myJob" class="com.seewoedu.train.quartz.GenerateRewardListTask" /> </beans>
3.被執行的方法
public class GenerateRewardListTask { @Autowired private GiftReceiveRecordService giftReceiveRecordService; org.slf4j.Logger logger = LoggerFactory.getLogger(GenerateRewardListTask.class); public void generate() throws Exception { giftReceiveRecordService.generateRewardMember(); //執行的方法 } }
4、需要注意的問題
1、執行時間指定到年份時,會存在一個問題,就是在你在過了這個時間後再啟動項目的時候,他會一直報一個memory leak的錯誤,大概的意思是你的定時任務將永遠不會被執行,導致項目一直啟動不了。
2、定時任務是通過你部署項目開始計算到你要執行定時任務的時間間隔,而不是實時獲取你服務器時間的方法實現的,所以通過修改服務器時間想測試定時任務是否生效是不可行的。