靜態定時任務
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秒一次,默認五秒)
結果: