• 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;
    }
    

    }

  • 相关阅读:
    关于Cocos Creator用js脚本代码播放骨骼动画的步骤和注意事项
    关于用Cocos2d-x.3.10运行别人游戏项目的步骤
    jq 获取select text
    one thinkphp 文档
    tp 大致执行流程
    mysql 命令行导入mysql语句
    htmt 5 素材
    er图 画图工具
    php zend studio 如何导入已经存在的项目
    php 获取当前域名
  • 原文地址:https://www.cnblogs.com/miniSimple/p/12993872.html
Copyright © 2020-2023  润新知