详细请看这篇博客

参考: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;
}

}

Cron表达式,springboot定时任务的更多相关文章

  1. 使用Cron表达式创建定时任务

    CronTriggerCronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用.CroTr ...

  2. 详解定时任务中的 cron 表达式

    1.前言 我们经常使用 cron 表达式来定义定时任务的执行策略,今天我们就总结一下 cron 表达式的一些相关知识. 2. cron 表达式的定义 cron 表达式是一个字符串,该字符串由 6 个空 ...

  3. springboot内嵌定时任务使用及cron表达式讲解

    第一步:pom引入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...

  4. 摆脱Spring 定时任务的@Scheduled cron表达式的困扰

    一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...

  5. (2)Spring集成Quartz定时任务框架介绍和Cron表达式详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  6. Spring集成Quartz定时任务框架介绍和Cron表达式详解

    原文地址:http://www.cnblogs.com/obullxl/archive/2011/07/10/spring-quartz-cron-integration.html 在JavaEE系统 ...

  7. Quartz.net 定时任务之Cron表达式

    一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...

  8. 摆脱定时任务的cron表达式的困扰

    一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...

  9. Quartz 定时任务设置某个时间区间每隔一定时间触发的cron表达式

    原文:https://blog.csdn.net/yansong_8686/article/details/46991189 Cron表达式 Quartz使用类似于Linux下的Cron表达式定义时间 ...

随机推荐

  1. dockerfile定制docker的脚本文件

    Dockerfile文件详解 #指定操作系统 FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image FROM centos #使用base ...

  2. 《机器学习_07_03_svm_核函数与非线性支持向量机》

    一.简介 前两节分别实现了硬间隔支持向量机与软间隔支持向量机,它们本质上都是线性分类器,只是软间隔对"异常点"更加宽容,它们对形如如下的螺旋数据都没法进行良好分类,因为没法找到一个 ...

  3. VMware如何克隆一个虚拟机

    如何在Vmware克隆一个虚拟机,并修改哪些配置. 克隆虚拟机步骤 其中模板虚拟机的安装部署可参见:「VMware安装Linux CentOS 7.7系统」 找到克隆的模板机,并选择克隆. 进入克隆虚 ...

  4. Map,HashMap五种遍历方法

    假设有数组            HashMap<Integer, String> h=new HashMap<Integer,String>();        h.put( ...

  5. 获取元素节点 & 操作属性节点

    1.html 文档编写 js 代码的位置: window.onload事件在整个html文档被完全加载完再执行,    所以可以获取html文档的任何节点 js-window-onload.html ...

  6. Rocket - diplomacy - wirePrefix

    https://mp.weixin.qq.com/s/DVcA2UixnB_6vgI3SjZGyQ   调试wirePrefix方法.   1. 实现   wirePrefix用于调整名称格式,其实现 ...

  7. Java实现 LeetCode 790 多米诺和托米诺平铺(递推)

    790. 多米诺和托米诺平铺 有两种形状的瓷砖:一种是 2x1 的多米诺形,另一种是形如 "L" 的托米诺形.两种形状都可以旋转. XX <- 多米诺 XX <- &q ...

  8. Java实现第八届蓝桥杯国赛 数字划分

    标题:数字划分 w星球的长老交给小明一个任务: 1,2,3-16 这16个数字分为两组. 要求: 这两组数字的和相同, 并且,两组数字的平方和也相同, 并且,两组数字的立方和也相同. 请你利用计算机的 ...

  9. Java实现 LeetCode 763 划分字母区间(暴力)

    763. 划分字母区间 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = & ...

  10. Java实现 蓝桥杯 算法提高 矩阵相乘

    算法提高 矩阵相乘 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也 ...