Cron表達式,springboot定時任務


詳細請看這篇博客

參考:https://blog.csdn.net/belonghuang157405/article/details/83410197

Cron表達式是一個字符串,字符串以5或6個空格隔開,分為6或7個域,每一個域代表一個含義,
Cron有如下兩種語法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year (秒、分、時、每月第幾天、月、星期、年)

Seconds Minutes Hours DayofMonth Month DayofWeek (秒、分、時、每月第幾天、月、星期)

注:corn從左到右(用空格隔開):秒 分 小時 月份中的日期 月份 星期中的日期 年份

字段取值:

字段 允許值 允許的特殊字符
秒(Seconds) 0~59的整數 , - * /    四個字符
分(Minutes) 0~59的整數 , - * /    四個字符
小時(Hours) 0~23的整數 , - * /    四個字符
日期(DayofMonth) 1~31的整數(但是你需要考慮你月的天數) ,- * ? / L W C     八個字符
月份(Month) 1~12的整數或者 JAN-DEC , - * /    四個字符
星期(DayofWeek) 1~7的整數或者 SUN-SAT (1=SUN) , - * ? / L C #     八個字符
年(可選,留空)(Year) 1970~2099 , - * /    四個字符

特殊字符含義: -

  • (1)*:表示匹配該域的任意值。假如在Minutes域使用*, 即表示每分鍾都會觸發事件。
  • (2)?:只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和DayofWeek會相互影響。例如想在每月的20日觸發調度,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上並不是這樣。
  • (3)-:表示范圍。例如在Minutes域使用5-20,表示從5分到20分鍾每分鍾觸發一次
  • (4)/:表示起始時間開始觸發,然后每隔固定時間觸發一次。例如在Minutes域使用5/20,則意味着5分鍾觸發一次,而25,45等分別觸發一次.
  • (5),:表示列出枚舉值。例如:在Minutes域使用5,20,則意味着在5和20分每分鍾觸發一次。
  • (6)L:表示最后,只能出現在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一個星期四觸發。
  • (7)W:表示有效工作日(周一到周五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。例如:在 DayofMonth使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(周一)觸發;如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份 。
  • (8)LW:這兩個字符可以連用,表示在某個月最后一個工作日,即最后一個星期五。
  • (9)#:用於確定每個月第幾個星期幾,只能出現在DayofMonth域。例如在4#2,表示某月的第二個星期三。

需求:模擬真實數據往數據庫中同時插入多條數據。

由於要模擬真實數據所以我在網上查了一些工具,比如javaFaker等,發現都滿足不了我的實際開發情況。(工具的字段都是封裝好了的)
所以我采用的是,用隨機數來解決真實數據的問題。

廢話不多說,直接上代碼



數據庫設計:

項目結構

項目啟動:

![](https://img2020.cnblogs.com/blog/1348997/202005/1348997-20200530173307567-873738261.png)

springboot配置文件

log4j.porpertis文件

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=firestorm.log

log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.com.codefutures=DEBUG

domain包

package com.element.testdata.domain; import lombok.Data; import java.io.Serializable;
  @Data

public class ElectricData implements Serializable {

private String code;
private String useType;
private Double voltage;
private Double current;
private Integer power;
private Double powerFactro;
private Double  eletricEnergy;
private String phase;
private Double freq;
private String time;
private String dataTime;
private String createAt;
private String updateAt;

}

dao包

ElectricDataDao接口:

package com.element.testdata.dao; import com.element.testdata.domain.ElectricData; import java.util.List;

public interface ElectricDataDao {

//每分鍾觸發一次
public  void insertData(List<ElectricData> list);

//每小時觸發一次
public void insertDataHours(List<ElectricData> list);

//每天觸發一次
public  void  insertDataDay(List<ElectricData> list);

}


ElectricDataDao.xml配置文件 (特別注意,配置文件名與接口名要一致)

<!-- 分鍾-->
<insert id="insertData" parameterType="java.util.List">
  INSERT  INTO tb_electric_data(code,use_type,voltage,current,power,power_factor,electric_energy,phase,freq,time,data_time,created_at,updated_at)
  values
  <foreach collection="list" item="item" index="index" separator=",">
  (#{item.code,jdbcType=VARCHAR},#{item.useType,jdbcType=VARCHAR},#{item.voltage,jdbcType=DOUBLE},#{item.current,jdbcType=DOUBLE},
      #{item.power,jdbcType=INTEGER},#{item.powerFactro,jdbcType=DOUBLE},#{item.eletricEnergy,jdbcType=DOUBLE},#{item.phase,jdbcType=VARCHAR},#{item.freq,jdbcType=DOUBLE},
      #{item.time,jdbcType=DATE},#{item.dataTime,jdbcType=DATE},#{item.createAt,jdbcType=DATE},#{item.updateAt,jdbcType=DATE}
      )
  </foreach>
</insert>

<!--小時-->
<insert id="insertDataHours" parameterType="java.util.List">
    INSERT  INTO tb_electric_data_hour(code,use_type,voltage,current,power,power_factor,electric_energy,phase,freq,time,data_time,created_at,updated_at)
    values
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.code,jdbcType=VARCHAR},#{item.useType,jdbcType=VARCHAR},#{item.voltage,jdbcType=DOUBLE},#{item.current,jdbcType=DOUBLE},
        #{item.power,jdbcType=INTEGER},#{item.powerFactro,jdbcType=DOUBLE},#{item.eletricEnergy,jdbcType=DOUBLE},#{item.phase,jdbcType=VARCHAR},#{item.freq,jdbcType=DOUBLE},
        #{item.time,jdbcType=DATE},#{item.dataTime,jdbcType=DATE},#{item.createAt,jdbcType=DATE},#{item.updateAt,jdbcType=DATE}
        )
    </foreach>
</insert>

<!--天-->
<insert id="insertDataDay" parameterType="java.util.List">
    INSERT  INTO tb_electric_data_day(code,use_type,voltage,current,power,power_factor,electric_energy,phase,freq,time,data_time,created_at,updated_at)
    values
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.code,jdbcType=VARCHAR},#{item.useType,jdbcType=VARCHAR},#{item.voltage,jdbcType=DOUBLE},#{item.current,jdbcType=DOUBLE},
        #{item.power,jdbcType=INTEGER},#{item.powerFactro,jdbcType=DOUBLE},#{item.eletricEnergy,jdbcType=DOUBLE},#{item.phase,jdbcType=VARCHAR},#{item.freq,jdbcType=DOUBLE},
        #{item.time,jdbcType=DATE},#{item.dataTime,jdbcType=DATE},#{item.createAt,jdbcType=DATE},#{item.updateAt,jdbcType=DATE}
        )
    </foreach>
</insert>

service包

ElectricDataServic

package com.element.testdata.service; import com.element.testdata.domain.ElectricData; import java.util.List;

public interface ElectricDataServic {

//每分鍾觸發一次
public  void insertData(List<ElectricData> list);

//每小時觸發一次
public void insertDataHours(List<ElectricData> list);

//每天觸發一次
public  void  insertDataDay(List<ElectricData> list);

}

ElectricDataServiceImpl

package com.element.testdata.service.impl;

import com.element.testdata.dao.ElectricDataDao;
import com.element.testdata.domain.ElectricData;
import com.element.testdata.service.ElectricDataServic;
import com.element.testdata.utils.RandomData;
import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class ElectricDataServiceImpl implements ElectricDataServic{

private Logger logger = Logger.getLogger(ElectricDataServiceImpl.class);

@Resource
private ElectricDataDao electricDataDao;

@Override
public void insertData(List<ElectricData> list) {
    electricDataDao.insertData(list);
}

@Override
public void insertDataHours(List<ElectricData> list) {
    electricDataDao.insertDataHours(list);
}

@Override
public void insertDataDay(List<ElectricData> list) {
    electricDataDao.insertDataDay(list);
}

@Scheduled(cron = "*/60 * * * * ?") // cron(秒、分、時、每月第幾天、月、星期)
public void  job(){
    RandomData randomData = new RandomData();

    List<ElectricData> users = new ArrayList<ElectricData>();

    int aUserType = randomData.getRandom(36,39);   // 固定每次定時的類型

    for (int i=0;i<36;i++){
        ElectricData electricData = new ElectricData();

        //設置值

        electricData.setVoltage(Double.parseDouble(randomData.getList().get(randomData.getRandom(40,46))));      //電壓
        electricData.setCurrent(Double.parseDouble(randomData.getList().get(randomData.getRandom(47,53))));      //電流
        electricData.setPower(Integer.parseInt(randomData.getList().get(randomData.getRandom(54,58))));        //功率
        electricData.setPowerFactro(Double.parseDouble(randomData.getList().get(randomData.getRandom(59,63))));  //功率因數
        electricData.setEletricEnergy(Double.parseDouble(randomData.getList().get(randomData.getRandom(64,68))));    //總電能
        electricData.setFreq(Double.parseDouble(randomData.getList().get(randomData.getRandom(72,75))));     //頻數
        electricData.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));     //時間
        electricData.setDataTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        electricData.setCreateAt(electricData.getTime());
        electricData.setUpdateAt(electricData.getTime());




        if ((i+1)%3==1){
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(69));    //A
            electricData.setCode(randomData.getList().get(i));
        }else if ((i+1)%3==2){
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(70));    //B
            electricData.setCode(randomData.getList().get(i));
        }else {
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(71));    //C
            electricData.setCode(randomData.getList().get(i));
        }
        users.add(electricData);

        //類型 每三次變化一次
        if((i+1)%3==0){
            aUserType = randomData.getRandom(36,39);
        }

    }

    insertData(users);
    System.out.println("service中執行了分鍾定時器。。。");
    logger.info("分鍾定時任務:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
}

@Scheduled(cron = "0 0 * * * ?")   // cron(秒、分、時、每月第幾天、月、星期)
public void jobHours(){
    RandomData randomData = new RandomData();

    List<ElectricData> users = new ArrayList<ElectricData>();

    int aUserType = randomData.getRandom(36,39);   // 固定每次定時的類型

    for (int i=0;i<36;i++){
        ElectricData electricData = new ElectricData();

        //設置值

        electricData.setVoltage(Double.parseDouble(randomData.getList().get(randomData.getRandom(40,46))));      //電壓
        electricData.setCurrent(Double.parseDouble(randomData.getList().get(randomData.getRandom(47,53))));      //電流
        electricData.setPower(Integer.parseInt(randomData.getList().get(randomData.getRandom(54,58))));        //功率
        electricData.setPowerFactro(Double.parseDouble(randomData.getList().get(randomData.getRandom(59,63))));  //功率因數
        electricData.setEletricEnergy(Double.parseDouble(randomData.getList().get(randomData.getRandom(64,68))));    //總電能
        electricData.setFreq(Double.parseDouble(randomData.getList().get(randomData.getRandom(72,75))));     //頻數
        electricData.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));     //時間
        electricData.setDataTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        electricData.setCreateAt(electricData.getTime());
        electricData.setUpdateAt(electricData.getTime());

        if ((i+1)%3==1){
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(69));    //A
            electricData.setCode(randomData.getList().get(i));
        }else if ((i+1)%3==2){
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(70));    //B
            electricData.setCode(randomData.getList().get(i));
        }else {
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(71));    //C
            electricData.setCode(randomData.getList().get(i));
        }
        users.add(electricData);

        //類型 每三次變化一次
        if((i+1)%3==0){
            aUserType = randomData.getRandom(36,39);
        }

    }

    insertDataHours(users);
    System.out.println("service中執行了小時定時器。。。");
    logger.info("小時定時任務:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
}

@Scheduled(cron = "0 0 0 * * ? ")  // cron(秒、分、時、每月第幾天、月、星期)
public void jobDay(){
    RandomData randomData = new RandomData();

    List<ElectricData> users = new ArrayList<ElectricData>();

    int aUserType = randomData.getRandom(36,39);   // 固定每次定時的類型

    for (int i=0;i<36;i++){
        ElectricData electricData = new ElectricData();

        //設置值

        electricData.setVoltage(Double.parseDouble(randomData.getList().get(randomData.getRandom(40,46))));      //電壓
        electricData.setCurrent(Double.parseDouble(randomData.getList().get(randomData.getRandom(47,53))));      //電流
        electricData.setPower(Integer.parseInt(randomData.getList().get(randomData.getRandom(54,58))));        //功率
        electricData.setPowerFactro(Double.parseDouble(randomData.getList().get(randomData.getRandom(59,63))));  //功率因數
        electricData.setEletricEnergy(Double.parseDouble(randomData.getList().get(randomData.getRandom(64,68))));    //總電能
        electricData.setFreq(Double.parseDouble(randomData.getList().get(randomData.getRandom(72,75))));     //頻數
        electricData.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));     //時間
        electricData.setDataTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        electricData.setCreateAt(electricData.getTime());
        electricData.setUpdateAt(electricData.getTime());

        if ((i+1)%3==1){
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(69));    //A
            electricData.setCode(randomData.getList().get(i));
        }else if ((i+1)%3==2){
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(70));    //B
            electricData.setCode(randomData.getList().get(i));
        }else {
            electricData.setUseType(randomData.getList().get(aUserType));  //類型
            electricData.setPhase( randomData.getList().get(71));    //C
            electricData.setCode(randomData.getList().get(i));
        }
        users.add(electricData);

        //類型 每三次變化一次
        if((i+1)%3==0){
            aUserType = randomData.getRandom(36,39);
        }

    }

    insertDataDay(users);
    System.out.println("service中執行了天定時器。。。");
    logger.info("天定時任務:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
}

}

utils包

RandomData

package com.element.testdata.utils;

import java.util.ArrayList;
import java.util.Random;

public class RandomData {

ArrayList<String> list;

public ArrayList<String> getList() {
    //設置隨機數
    list = new ArrayList<String>(){{
        //code   36      0 - 35
        add("01A");
        add("01B");
        add("01C");
        add("02A");
        add("02B");
        add("02C");
        add("03A");
        add("03B");
        add("03C");
        add("04A");
        add("04B");
        add("04C");
        add("05A");
        add("05B");
        add("05C");
        add("06A");
        add("06B");
        add("06C");
        add("07A");
        add("07B");
        add("07C");
        add("08A");
        add("08B");
        add("08C");
        add("09A");
        add("09B");
        add("09C");
        add("10A");
        add("10B");
        add("10C");
        add("11A");
        add("11B");
        add("11C");
        add("12A");
        add("12B");
        add("12C");


        //user_type  4   36-39
        add("照明");
        add("插座");
        add("空調");
        add("電腦");
        //voltage   7     40-46
        add("224.68");
        add("222.13");
        add("225.44");
        add("223.06");
        add("227.09");
        add("226.01");
        add("225.05");
        //current   7    47-53
        add("1.59");
        add("1.53");
        add("3.00");
        add("4.00");
        add("2.31");
        add("1.43");
        add("1.34");
        //power     5    54-58
        add("2");
        add("3");
        add("5");
        add("7");
        add("4");
        //powerFactro  5     59-63
        add("0.999");
        add("1.999");
        add("2.35");
        add("3.12");
        add("0.09");
        //eletricEnergy     5        64-68
        add("0.625");
        add("1.78");
        add("2.56");
        add("3.37");
        add("0.25");
        //phase     3       69-71
        add("A");
        add("B");
        add("C");
        //freq      4    72-75
        add("50.0");
        add("49.96");
        add("50.03");
        add("49.91");

    }};

    return list;
}

int anInt; 
Random random = new Random();

public int getRandom(int min,int max){     // min最小,max最大 獲取[min,max]之間的數
    anInt = random.nextInt(max)%(max-min+1) + min;

    return anInt;
}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM