springboot 靜態、動態 定時任務

靜態定時任務

package com.lsbj.biz;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @Auther: zs
 * @Date: 2019/1/9 11:34
 * @Description:
 */
@Component
@Configuration
@EnableScheduling
public class ScheduTask {

    /**
     * 凌晨一點統計昨天的
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void statisticTask(){
        System.out.println("靜態定時任務:"+System.currentTimeMillis()/1000);
    }
}
EnableScheduling註解:開啓定時任務;Configuration註解:配置註解(不用也行);Component註解:實體註解,交由spring容器管理

效果:

五秒一次

動態定時任務

package com.lsbj.biz;

import javafx.scene.Parent;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.regex.Pattern;

/**
 * @Auther: zs
 * @Date: 2019/1/16 16:19
 * @Description:
 */
@Component
@EnableScheduling
public class DynamicScheduTask implements SchedulingConfigurer{

    //默認五秒執行一次
    private static final String DEFAULT_CRON = "0/5 * * * * ?";

    //查詢數據庫接口,獲得最新cron
    @Mapper
    public interface CronMapper {
        @Select("select mender from setting_office where id = '23'")
        String getCron();
    }
    //注入cron接口
    @Autowired
    CronMapper cronMapper;


    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        System.out.println("===========1=============");
        scheduledTaskRegistrar.addTriggerTask(task(),trigger());
    }

    private Runnable task(){
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("動態定時任務:"+System.currentTimeMillis()/1000);
            }
        };
        return runnable;
    }
    private Trigger trigger(){
        return new Trigger() {
            //下一次觸發事件
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                System.out.println("===========2=============");
                Date date = null;
                try{
                    //cron表達式異常時,進入catch執行默認cron表達式
                    CronTrigger cronTrigger = new CronTrigger(getCron());
                    date = cronTrigger.nextExecutionTime(triggerContext);
                }catch (Exception e){
                    System.out.println("===========4====cron異常(取默認值)");
                    CronTrigger cronTrigger = new CronTrigger(DEFAULT_CRON);
                    date = cronTrigger.nextExecutionTime(triggerContext);
                }
                return date;
            }
        };
    }

    private String getCron(){
        //可以通過數據庫,redis或其他方式獲取cron表達式
        //從數據庫獲取
        String cron = cronMapper.getCron();
        System.out.println("cron:"+cron);
        return cron;
    }
}

異常cron

數據庫cron:aaa* * * * ?

結果:

異常時取默認值5秒執行一次;

正常cron時
數據庫cron:0/6 * * * * ?(6秒一次,默認五秒)

結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章