1 springboot之動態配置定時任務
阿新 • • 發佈:2019-01-01
最近專案中有關於springboot中動態配置定時任務的需求,查閱各種資料,最終實現了可以動態的開關定時器,以及配置定時器的時間節點。
網上有很多關於springboot定時任務的介紹,之前專案中也用過quartz,和springboot中自帶的@Schedule相比較,配置稍顯複雜。本篇幅只介紹@Schedule的用法。
網上有很多關於springboot定時任務的文章,大部分都是靜態配置,本篇主要介紹動態配置定時任務,且不需要重啟專案:
關於新建springboot專案,我就不絮叨了,直接進正題:
一:springboot配置靜態定時任務
1:pom中新增依賴
2:啟動類中加入@EnableScheduling來開啟定時任務
3:@Scheduled(cron = "0/10* * * * ?")// 每過10秒執行一次
靜態配置就說這些,網上資料非常多,主要說一下動態配置定時任務。
二:springboot動態配置定時任務
專案接到需求後,經過分析,決定將cron持久化至資料庫中,實現動態修改定時任務的週期,並且可以通過前後臺互動,實現頁面更改,本篇幅只介紹到controller層,前臺js,ajax,各位小友可以根據專案需求自行新增。
config(核心):
/** * Created by zhangdd on 2018/1/15 0015. */ @Component public class ScheduleConfig { @Autowiredprivate ThreadPoolTaskScheduler threadPoolTaskScheduler; @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ return new ThreadPoolTaskScheduler(); } private ScheduledFuture<?> future; private String cron = ""; public String getCron() { returncron; } public void stopCron() { if (future != null) { //取消定時任務 future.cancel(true); } } public void setCron(String cron) { this.cron = cron; stopCron(); future = threadPoolTaskScheduler.schedule(new Runnable() { @Override public void run() { try { System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } catch (Exception e) { e.printStackTrace(); } } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { if ("".equals(cron) || cron == null) { return null; } // 定時任務觸發,可修改定時任務的執行週期 CronTrigger trigger = new CronTrigger(cron); Date nextExecDate = trigger.nextExecutionTime(triggerContext); return nextExecDate; } }); } }
Cron(實體類):
/** * Created by zhangdd on 2018/1/15 0015. */ @Entity public class Cron { @Id @GeneratedValue private Integer no; /** * cron_id */ private String cronId; /** * cron */ private String cron; /** * 狀態("1":有效 "0":無效) */ private String status; public Cron() { } public Integer getNo() { return no; } public void setNo(Integer no) { this.no = no; } public String getCronId() { return cronId; } public void setCronId(String cronId) { this.cronId = cronId; } public String getCron() { return cron; } public void setCron(String cron) { this.cron = cron; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } }
Dao:
/** * Created by zhangdd on 2018/1/15 0015. */ public interface CronDao extends CrudRepository<Cron,Integer> { public Cron findByCronIdAndStatus(String cronId,String status); }
Service:
/** * Created by zhangdd on 2018/1/15 0015. */ @Service public class CronServiceImpl implements CronService { @Autowired private CronDao cronDao; @Override public Cron findByCronIdAndStatus(String cronId,String status) { return cronDao.findByCronIdAndStatus(cronId,status); } }
Controller:
/** * (開啟定時任務) */ @RequestMapping("/startPay") @ResponseBody public String payFee() { String cron = cronService.findByCronIdAndStatus("1","1").getCron(); if(!StringUtils.isEmpty(cron)) { scheduleConfig.setCron(cron); logger.info("開啟定時任務成功"); return "開啟定時任務成功"; } else { logger.error("開啟定時任務失敗"); return "開啟定時任務失敗"; } }
/** * (關閉定時任務) */ @RequestMapping("/closePay") @ResponseBody public String closePayFee() { try { scheduleConfig.stopCron(); logger.info("關閉定時任務成功"); return "關閉定時任務成功"; }catch (Exception e){ logger.error("關閉定時任務失敗"); } return "關閉定時任務失敗"; }
以上,從config到controller,可以實現動態開啟關閉定時任務,並且不需要重啟專案,各位小友可以根據自身專案需求自行做出更改,如嵌入前臺頁面進行互動,親測是可用的。本文是自己的理解,如果小友覺得有什麼不對的地方,歡迎一起討論。
最後加上專案的結構:
com.zdd
config
entity
dao
service
impl
controller