Spring實現(xiàn)動態(tài)修改時間參數(shù)并手動開啟關(guān)停操作
spring實現(xiàn)定時任務的方式有三種,分別是java自帶的timer類、spring task和quartz三種。
本文只介紹spring自帶的task和第三方quartz。spirng task可以將它比作一個輕量級的Quartz,使用起來非常簡單,除spring相關(guān)的包外不需要額外的包,而且支持注解和配置文件兩種。接著直接演示spring task注解實現(xiàn)方式。
首先,創(chuàng)建任務類,如下:
@Component
public class MyScheduler {
int i =0;
public void run(){
i++;
// 任務邏輯
System.out.println("第"+(i)+"次開始執(zhí)行操作... " +"時間:【"
+ 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配置文件來一發(fā):
<task:scheduled-tasks>
<task:scheduled ref="myScheduler" method="run" cron="0/5 * * * * ?"/>
</task:scheduled-tasks>
大功告成,可以用了,但是感覺很麻煩,也很死板,也就用來寫寫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++;
// 需要實現(xiàn)的任務邏輯
logger.info("第"+(i)+"次開始執(zhí)行操作... " +"時間:【"
+ new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS").format(new Date())
+ "】");
}
}, new Trigger(){
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//任務觸發(fā),可修改任務的執(zhí)行周期
CronTrigger trigger = new CronTrigger(cron);
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
});
}
}
實現(xiàn)SchedulingConfigurer接口的configureTasks方法,如果直接啟動項目,就可以實現(xiàn)每秒5次該方法的執(zhí)行了,一旦cron參數(shù)被修改,ScheduledTaskRegistrar偵測到后會重新創(chuàng)建一個觸發(fā)器來實現(xiàn)新的cron表達式任務,這就解決了動態(tài)調(diào)度定時任務的問題了,而之前spring配置文件中關(guān)于任務類的內(nèi)容也可以刪除了。另外,你可以修改spring task的任務池來增加可同時存在的任務數(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"/>
我們在web項目中有時候需要手動關(guān)停定時任務,或者需要立即執(zhí)行定時任務具有的功能,這時的spring task就力不從心了,這也是它輕量級的原因,使用簡單,但提供的功能不夠強大,這時候就輪到Quartz出場了。Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域又一個開源項目,它可以與J2EE與J2SE應用程序相結(jié)合也可以單獨使用。Quartz可以用來創(chuàng)建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標準的Java組件或 EJBs。
各位有興趣可以去參考jeecg框架的定時任務開發(fā),它對其進行了整合,使用起來及其方便。

接著我們自己來整合Quartz,實現(xiàn)動態(tài)定時任務。先理清思路,1.導入jar包;2.配置spring文件;3.編寫任務代碼。
首先導入需要的jar包,我這里使用spring 4.1.9版本及Quartz 2.2.7,對了,spring 3.1.x 以上才支持 Quartz 2.x 的jar包,原因就不細說了,各位自行百度。
總結(jié)
以上所述是小編給大家介紹的Spring實現(xiàn)動態(tài)修改時間參數(shù)并手動開啟關(guān)停操作,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Spring探秘之如何妙用BeanPostProcessor
BeanPostProcessor也稱為Bean后置處理器,它是Spring中定義的接口,在Spring容器的創(chuàng)建過程中會回調(diào)BeanPostProcessor中定義的兩個方法,這篇文章主要給大家介紹了關(guān)于Spring探秘之如何妙用BeanPostProcessor的相關(guān)資料,需要的朋友可以參考下2022-01-01
Spring?@Conditional通過條件控制bean注冊過程
這篇文章主要為大家介紹了Spring?@Conditional通過條件控制bean注冊過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
SpringBoot中將@Bean方法解析為BeanDefinition詳解
這篇文章主要介紹了SpringBoot中將@Bean方法解析為BeanDefinition詳解,得到的BeanDefinition是ConfigurationClassBeanDefinition類型,會為BeanDefinition設置factoryMethodName,這意味著當實例化這個bean的時候?qū)⒉捎霉S方法,需要的朋友可以參考下2023-12-12
java數(shù)組的三種擴容方式以及程序?qū)崿F(xiàn)詳解
這篇文章主要介紹了java數(shù)組的三種擴容方式以及程序?qū)崿F(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12

