1. 程式人生 > >1 springboot之動態配置定時任務

1 springboot之動態配置定時任務

最近專案中有關於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 {
    @Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler; @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ return new ThreadPoolTaskScheduler(); } private ScheduledFuture<?> future; private String cron = ""; public String getCron() { return
cron; } 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