生活随笔
收集整理的這篇文章主要介紹了
spring task 定时
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近工作中需要用到定時(shí)任務(wù)的功能,雖然Spring3也自帶了一個(gè)輕量級(jí)的定時(shí)任務(wù)實(shí)現(xiàn),但感覺(jué)不夠靈活,功能也不夠強(qiáng)大。在考慮之后,決定整合更為專(zhuān)業(yè)的Quartz來(lái)實(shí)現(xiàn)定時(shí)任務(wù)功能。
首先,當(dāng)然是添加依賴(lài)的jar文件,我的項(xiàng)目是maven管理的,以下的我項(xiàng)目的依賴(lài):
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.7.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>${commons.lang.version}</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>${commons.dbcp.version}</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>${ojdbc.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency></dependencies> 或許你應(yīng)該看出來(lái)了,我的項(xiàng)目是spring整合了mybatis,目前spring的最新版本已經(jīng)到了4.x系列,但是最新版的mybatis-spring的整合插件所依賴(lài)推薦的依然是spring 3.1.3.RELEASE,所以這里沒(méi)有用spring的最新版而是用了推薦的3.1.3.RELEASE,畢竟最新版本的功能一般情況下也用不到。
至于quartz,則是用了目前的最新版2.2.1
之所以在這里特別對(duì)版本作一下說(shuō)明,是因?yàn)閟pring和quartz的整合對(duì)版本是有要求的。
spring3.1以下的版本必須使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然會(huì)出錯(cuò)。
至于原因,則是spring對(duì)于quartz的支持實(shí)現(xiàn),org.springframework.scheduling.quartz.CronTriggerBean繼承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是個(gè)類(lèi),而在quartz2.x系列中org.quartz.CronTrigger變成了接口,從而造成無(wú)法用spring的方式配置quartz的觸發(fā)器(trigger)。
在Spring中使用Quartz有兩種方式實(shí)現(xiàn):第一種是任務(wù)類(lèi)繼承QuartzJobBean,第二種則是在配置文件里定義任務(wù)類(lèi)和要執(zhí)行的方法,類(lèi)和方法可以是普通類(lèi)。很顯然,第二種方式遠(yuǎn)比第一種方式來(lái)的靈活。
這里采用的就是第二種方式。
spring配置文件:
<!-- 使用MethodInvokingJobDetailFactoryBean,任務(wù)類(lèi)可以不實(shí)現(xiàn)Job接口,通過(guò)targetMethod指定調(diào)用方法--><bean id="taskJob" class="com.tyyd.dw.task.DataConversionTask"/><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="group" value="job_work"/> <property name="name" value="job_work_name"/> <!--false表示等上一個(gè)任務(wù)執(zhí)行完后再開(kāi)啟新的任務(wù)--> <property name="concurrent" value="false"/> <property name="targetObject"> <ref bean="taskJob"/> </property> <property name="targetMethod"> <value>run</value> </property></bean><!-- 調(diào)度觸發(fā)器 --><bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="name" value="work_default_name"/> <property name="group" value="work_default"/> <property name="jobDetail"> <ref bean="jobDetail" /> </property> <property name="cronExpression"> <value>0/5 * * * * ?</value> </property></bean><!-- 調(diào)度工廠(chǎng) --><bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="myTrigger"/> </list> </property></bean> Task類(lèi)則是一個(gè)普通的Java類(lèi),沒(méi)有繼承任何類(lèi)和實(shí)現(xiàn)任何接口(當(dāng)然可以用注解方式來(lái)聲明bean):
//@Componentpublic class DataConversionTask{ /** 日志對(duì)象 */ private static final Logger LOG = LoggerFactory.getLogger(DataConversionTask.class); public void run() { if (LOG.isInfoEnabled()) { LOG.info("數(shù)據(jù)轉(zhuǎn)換任務(wù)線(xiàn)程開(kāi)始執(zhí)行"); } }} 至此,簡(jiǎn)單的整合大功告成,run方法將每隔5秒執(zhí)行一次,因?yàn)榕渲昧薱oncurrent等于false,所以假如run方法的執(zhí)行時(shí)間超過(guò)5秒,在執(zhí)行完之前即使時(shí)間已經(jīng)超過(guò)了5秒下一個(gè)定時(shí)計(jì)劃執(zhí)行任務(wù)仍不會(huì)被開(kāi)啟,如果是true,則不管是否執(zhí)行完,時(shí)間到了都將開(kāi)啟。
?
接下去,將實(shí)現(xiàn)如何動(dòng)態(tài)的修改定時(shí)執(zhí)行的時(shí)間,以及如何停止正在執(zhí)行的任務(wù),待續(xù),,,
?
順便貼一下cronExpression表達(dá)式備忘: 字段 允許值 允許的特殊字符
秒 0-59 , – * /
分 0-59 , – * /
小時(shí) 0-23 , – * /
日期 1-31 , – * ? / L W C
月份 1-12 或者 JAN-DEC , – * /
星期 1-7 或者 SUN-SAT , – * ? / L C #
年(可選) 留空, 1970-2099 , – * /
表達(dá)式意義
"0 0 12 * * ?" 每天中午12點(diǎn)觸發(fā)
"0 15 10 ? * *" 每天上午10:15觸發(fā)
"0 15 10 * * ?" 每天上午10:15觸發(fā)
"0 15 10 * * ? *" 每天上午10:15觸發(fā)
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā)
"0 * 14 * * ?" 在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)
"0 0/5 14 * * ?" 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
"0 0/5 14,18 * * ?" 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
"0 0-5 14 * * ?" 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發(fā)
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發(fā)
"0 15 10 15 * ?" 每月15日上午10:15觸發(fā)
"0 15 10 L * ?" 每月最后一日的上午10:15觸發(fā)
"0 15 10 ? * 6L" 每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6#3" 每月的第三個(gè)星期五上午10:15觸發(fā)
每天早上6點(diǎn)
0 6 * * *
每?jī)蓚€(gè)小時(shí)
0 */2 * * *
晚上11點(diǎn)到早上8點(diǎn)之間每?jī)蓚€(gè)小時(shí),早上八點(diǎn)
0 23-7/2,8 * * *
每個(gè)月的4號(hào)和每個(gè)禮拜的禮拜一到禮拜三的早上11點(diǎn)
0 11 4 * 1-3
1月1日早上4點(diǎn)
0 4 1 1 *
?
轉(zhuǎn)至:http://www.meiriyouke.net/?p=82
轉(zhuǎn)載于:https://www.cnblogs.com/AmbitiousMice/p/5916079.html
總結(jié)
以上是生活随笔為你收集整理的spring task 定时的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。