Spring實(shí)現(xiàn)動(dòng)態(tài)修改時(shí)間參數(shù)并手動(dòng)開(kāi)啟關(guān)停操作
spring實(shí)現(xiàn)定時(shí)任務(wù)的方式有三種,分別是java自帶的timer類(lèi)、spring task和quartz三種。
本文只介紹spring自帶的task和第三方quartz。spirng task可以將它比作一個(gè)輕量級(jí)的Quartz,使用起來(lái)非常簡(jiǎn)單,除spring相關(guān)的包外不需要額外的包,而且支持注解和配置文件兩種。接著直接演示spring task注解實(shí)現(xiàn)方式。
首先,創(chuàng)建任務(wù)類(lèi),如下:
@Component public class MyScheduler { int i =0; public void run(){ i++; // 任務(wù)邏輯 System.out.println("第"+(i)+"次開(kāi)始執(zhí)行操作... " +"時(shí)間:【" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS").format(new Date()) + "】"); } }
接著,在spring的配置文件中添加命名空間及描述:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:task="http://www.springframework.org/schema/task" ...... xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd">
最后,spring配置文件來(lái)一發(fā):
<task:scheduled-tasks> <task:scheduled ref="myScheduler" method="run" cron="0/5 * * * * ?"/> </task:scheduled-tasks>
大功告成,可以用了,但是感覺(jué)很麻煩,也很死板,也就用來(lái)寫(xiě)寫(xiě)demo,那么就稍微改造一下吧。
@Service @Lazy(false) @EnableScheduling public class MyScheduler extends BaseService implements SchedulingConfigurer{ public static String cron = "0/2 * * * * ?"; int i =0; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(new Runnable() { @Override public void run() { i++; // 需要實(shí)現(xiàn)的任務(wù)邏輯 logger.info("第"+(i)+"次開(kāi)始執(zhí)行操作... " +"時(shí)間:【" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS").format(new Date()) + "】"); } }, new Trigger(){ @Override public Date nextExecutionTime(TriggerContext triggerContext) { //任務(wù)觸發(fā),可修改任務(wù)的執(zhí)行周期 CronTrigger trigger = new CronTrigger(cron); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }); } }
實(shí)現(xiàn)SchedulingConfigurer接口的configureTasks方法,如果直接啟動(dòng)項(xiàng)目,就可以實(shí)現(xiàn)每秒5次該方法的執(zhí)行了,一旦cron參數(shù)被修改,ScheduledTaskRegistrar偵測(cè)到后會(huì)重新創(chuàng)建一個(gè)觸發(fā)器來(lái)實(shí)現(xiàn)新的cron表達(dá)式任務(wù),這就解決了動(dòng)態(tài)調(diào)度定時(shí)任務(wù)的問(wèn)題了,而之前spring配置文件中關(guān)于任務(wù)類(lèi)的內(nèi)容也可以刪除了。另外,你可以修改spring task的任務(wù)池來(lái)增加可同時(shí)存在的任務(wù)數(shù)量,如下:
<task:executor id="executor" pool-size="10"/> <task:scheduler id="scheduler" pool-size="10"/> <task:annotation-driven scheduler="scheduler" executor="executor" proxy-target-class="true"/>
我們?cè)趙eb項(xiàng)目中有時(shí)候需要手動(dòng)關(guān)停定時(shí)任務(wù),或者需要立即執(zhí)行定時(shí)任務(wù)具有的功能,這時(shí)的spring task就力不從心了,這也是它輕量級(jí)的原因,使用簡(jiǎn)單,但提供的功能不夠強(qiáng)大,這時(shí)候就輪到Quartz出場(chǎng)了。Quartz是OpenSymphony開(kāi)源組織在Job scheduling領(lǐng)域又一個(gè)開(kāi)源項(xiàng)目,它可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨(dú)使用。Quartz可以用來(lái)創(chuàng)建簡(jiǎn)單或?yàn)檫\(yùn)行十個(gè),百個(gè),甚至是好幾萬(wàn)個(gè)Jobs這樣復(fù)雜的程序。Jobs可以做成標(biāo)準(zhǔn)的Java組件或 EJBs。
各位有興趣可以去參考jeecg框架的定時(shí)任務(wù)開(kāi)發(fā),它對(duì)其進(jìn)行了整合,使用起來(lái)及其方便。
接著我們自己來(lái)整合Quartz,實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)。先理清思路,1.導(dǎo)入jar包;2.配置spring文件;3.編寫(xiě)任務(wù)代碼。
首先導(dǎo)入需要的jar包,我這里使用spring 4.1.9版本及Quartz 2.2.7,對(duì)了,spring 3.1.x 以上才支持 Quartz 2.x 的jar包,原因就不細(xì)說(shuō)了,各位自行百度。
總結(jié)
以上所述是小編給大家介紹的Spring實(shí)現(xiàn)動(dòng)態(tài)修改時(shí)間參數(shù)并手動(dòng)開(kāi)啟關(guān)停操作,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot實(shí)現(xiàn)自定義配置文件提示的方法
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)自定義配置文件提示的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03MyBatis Plus關(guān)閉SQL日志打印的方法
這篇文章主要介紹了MyBatis-Plus如何關(guān)閉SQL日志打印,文中通過(guò)圖文結(jié)合講解的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2024-02-02Java源碼解析阻塞隊(duì)列ArrayBlockingQueue功能簡(jiǎn)介
今天小編就為大家分享一篇關(guān)于Java源碼解析阻塞隊(duì)列ArrayBlockingQueue功能簡(jiǎn)介,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解
SpringBootAdmin是一個(gè)管理和監(jiān)控SpringBoot應(yīng)用程序的工具,可通過(guò)集成和配置實(shí)現(xiàn)應(yīng)用監(jiān)控與告警功能,本文給大家介紹Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解,感興趣的朋友跟隨小編一起看看吧2024-09-09mybatis對(duì)象List<String> List<Integer>屬性映射方式
這篇文章主要介紹了mybatis對(duì)象List<String> List<Integer>屬性映射方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Netty網(wǎng)絡(luò)編程零基礎(chǔ)入門(mén)
Netty是一個(gè)異步的、基于事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用于快速開(kāi)發(fā)可維護(hù)、高性能的網(wǎng)絡(luò)服務(wù)器和客戶(hù)端,如果你還不了解它的使用,就趕快繼續(xù)往下看吧2022-08-08MybatisPlus中@TableField注解的使用詳解
這篇文章主要介紹了MybatisPlus中@TableField注解的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09spring bean標(biāo)簽的primary屬性用法講解
這篇文章主要介紹了spring bean標(biāo)簽的primary屬性用法講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09