詳細請看這篇博客
參考: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等,發現都滿足不了我的實際開發情況。(工具的字段都是封裝好了的)
所以我采用的是,用隨機數來解決真實數據的問題。
廢話不多說,直接上代碼
數據庫設計:
項目結構
項目啟動:
springboot配置文件
log4j.porpertis文件
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包
@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接口:
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
public interface ElectricDataServic {
//每分鍾觸發一次
public void insertData(List<ElectricData> list);
//每小時觸發一次
public void insertDataHours(List<ElectricData> list);
//每天觸發一次
public void insertDataDay(List<ElectricData> list);
}
ElectricDataServiceImpl
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
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;
}
}