動態改變Spring定時任務執行頻率
一.引入
由於公司門戶系統需要定時推送數據進國家平臺,所以首先想到的是利用spring的定時任務進行定時推送,當然對於這種需求比較簡單,如下操作即可:
1.打開任務調度使用,在applicationContext.xml中添加 <task:annotation-driven />,即配置打開了任務調度
當然注意了:頭文件上需要加上
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd ">
2.自定義一個 任務調度的類,這裏我寫爲了:MyScheduler.java ,爲了讓spring能夠管理到,加上了Component註解,然後方法上加上Scheduled註解,進行配置調度的頻率(1000*60)-代表1分鐘調用一次
@Component("scheduledTaskManager")
public class MyScheduler {
@Scheduled(fixedRate = 1000*60)
public void heartbeat() {
//任務邏輯
}
}
這樣配置就結束了,很簡單明瞭。
二.動態修改調度頻率
通過上述的配置,已經實現了簡單的定時任務調度,但是這中寫法不適宜動態修改,至少我還沒有按照上述的寫法動態修改頻率成功過,於是,這裏寫一下另外一種寫法:
定義一個任務類:updateCronTask.java,這個類實現SchedulingConfigurer接口的configureTasks方法
@Component
@EnableScheduling
public class updateCronTask 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++;
// 任務邏輯
System.out.println("第"+(i)+"次開始執行操作... " +"時間:【" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS").format(new Date()) + "】");
}
}, new Trigger(){
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//任務觸發,可修改任務的執行週期
CronTrigger trigger = new CronTrigger(cron);
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
});
}
}
項目啓動後,只要觸發改變cron的參數即可實現動態 修改任務調度頻率,如:測試在controller層中,當訪問了 某個url後,觸發改變了cron 的參數,達到了預期的效果。
開始默認的頻率是2s /次,後來通過controller層進行修改成了10s /次,
如果你有更好的方法,記得分享出來。