通过SpringTask模拟打印机定时向数据库传入模拟数据

目录

一、SpringTask简介及使用方法

1.简介

2.使用方法

1)在启动类上加上@EnableScheduling注解

2)编写定时任务类Task

3.注意事项

二、实现模拟打印机定时向数据库传入数据

1.用到的DTO类

2.用到的Mapper

3.Task类


一、SpringTask简介及使用方法

1.简介

SpringTask 是 Spring 框架提供的任务调度工具,它允许按照预定的时间自动执行特定的代码逻辑。

因此我们在一个spring项目中使用SpringTask时,无须引入新的依赖。

2.使用方法

1)在启动类上加上@EnableScheduling注解

@SpringBootApplication
@EnableScheduling
public class LANApplication {public static void main(String[] args) {SpringApplication.run(LANApplication.class,args);}
}

2)编写定时任务类Task


@Component
@Slf4j
public class DataInputPerDayTask {@Scheduled(cron = "0 0 1 1/2 * ?") // 每隔一天的凌晨1点执行public void inputData(){log.info("开始向数据库加入打印机模拟数据...");// 生成模拟数据并调用service方法保存数据}}

3.注意事项

在编写定时任务类Task时,有两个重要的地方需要注意:

1.需要在类前加上@Component注解,将这个类注入到spring容器当中交给容器管理

2.在需要定时执行的方法前加上@Scheduled注解并加上cron表达式来说明定时执行的周期

3.其中cron表达式可在在线生成网站上生成,网址如下:在线Cron表达式生成器

二、实现模拟打印机定时向数据库传入数据

1.用到的DTO类


import lombok.Data;
import java.util.Date;@Data
public class JobTaskDTO {private Integer id;private String sn;private String currentJobId;private String currentJobName;private Double currentJobLayerHeight;private Integer currentJobStartLayer;private Integer currentJobCurrentLayer;private Date currentJobStartTime;private Date currentJobEndTime;private Date currentJobEstimateTime;private Integer currentJobMaxLayerNo;private Date updTime;private Integer isFinish;private Integer isOld;private Double currentJobPowderUsage;
}

import lombok.Data;
import java.util.Date;@Data
public class PrinterStatisticsDTO {private Integer id;private String sn;private String workTimeLong;private String idleTimeLong;private Double powderUsage;private Double printWeight;private Date date;
}

2.用到的Mapper

@Mapper
public interface TaskMapper {/*** 插入作业状态数据* @param jobTaskDTO 作业状态数据对象* @return 插入结果*/@Insert("INSERT INTO printer_job_status (sn, current_job_id, current_job_name, current_job_layer_height, " +"current_job_start_layer, current_job_current_layer, current_job_start_time, current_job_end_time, " +"current_job_estimate_time, current_job_max_layer_no, upd_time, is_finish, is_old, " +"current_job_powder_usage) " +"VALUES (#{sn}, #{currentJobId}, #{currentJobName}, #{currentJobLayerHeight}, " +"#{currentJobStartLayer}, #{currentJobCurrentLayer}, #{currentJobStartTime}, #{currentJobEndTime}, " +"#{currentJobEstimateTime}, #{currentJobMaxLayerNo}, #{updTime}, #{isFinish}, #{isOld}, " +"#{currentJobPowderUsage})")@Options(useGeneratedKeys = true, keyProperty = "id")int insertJobStatus(JobTaskDTO jobTaskDTO);@Insert("INSERT INTO printer_statistics (sn, work_time_long, idle_time_long, powder_usage, print_weight, date) " +"VALUES (#{sn}, #{workTimeLong}, #{idleTimeLong}, #{powderUsage}, #{printWeight}, #{date})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertPrinterStatistics(PrinterStatisticsDTO printerStatisticsDTO);
}

这里简单解释一下为什么要用mapper,而不是从controller和service开始往下传:

因为打印机从controller传过来的数据时字节流数据,从controller传过来在service中经过解析成对应的对象再传入数据库,如果用Task从controller中传过来,那就要模拟字节流数据和模拟http请求,特别繁琐且复杂,这里直接采用最直接的方式直接在task中封装好对象用mapper传进数据库即可。

3.Task类

@Component
@Slf4j
public class DataInputPerDayTask {@Autowiredprivate StreamServiceImpl streamServiceImpl;@Autowiredprivate TaskMapper taskMapper;/*** 每隔一天的凌晨1点执行该方法向数据库传入打印机模拟数据(增加一条打印机)*/@Scheduled(cron = "0 0 1 1/2 * ?") // 每隔一天的凌晨1点执行
//    @Scheduled(cron = "0/5 * * * * ? ") // 每隔五秒测试public void inputData(){
//        log.info("开始向数据库加入打印机模拟数据...");// 生成模拟数据并调用service方法保存数据//PrinterFormat printerFormat = generateMockData();//treamServiceImpl.savePrinterInfo(printerFormat);}/*** 生成打印机事件数据*/@Scheduled(cron = "0 0 1 1/2 * ?") // 每隔一天的凌晨1点执行
//    @Scheduled(cron = "0/5 * * * * ? ") // 每隔五秒测试public void insertJobData() {log.info("开始向数据库加入打印机事件模拟数据...");JobTaskDTO jobTaskDTO = generateJobDataTask();taskMapper.insertJobStatus(jobTaskDTO);}@Scheduled(cron = "0 0 1 1/2 * ?") // 每隔一天的凌晨1点执行
//    @Scheduled(cron = "0/5 * * * * ? ") // 每隔五秒测试public void insertPrinterStatisticsData() {log.info("开始向数据库加入粉料模拟数据...");PrinterStatisticsDTO printerStatisticsDTO = generatePrinterStatisticsData();taskMapper.insertPrinterStatistics(printerStatisticsDTO);}//-----------------------------以下为生成模拟数据的逻辑----------------------------------------------------/*** 生成打印机模拟数据* @return*/private PrinterFormat generateMockData() {PrinterFormat printerFormat = new PrinterFormat();// 常规属性General general = new General();general.setAirDir("Y+");general.setDog("SN" + new Random().nextInt(10000));general.setId("ID" + new Random().nextInt(10000));general.setManufacturer("广州晋原铭科技有限公司");general.setManufacturerId("JYM99999T2107GD-CN");general.setScannerNum(new Random().nextInt(5));printerFormat.setGeneral(general);// 振镜卡对象scanner列表PrinterScannerInfo[] scanners = new PrinterScannerInfo[2]; // 假设有两个scannerfor (int i = 0; i < scanners.length; i++) {PrinterScannerInfo scanner = new PrinterScannerInfo();scanner.setColId(new Random().nextInt(10));scanner.setRowId(new Random().nextInt(10));scanner.setX0(new Random().nextDouble() * 100);scanner.setY0(new Random().nextDouble() * 100);scanners[i] = scanner;}printerFormat.setScanners(scanners);// 工作区属性Workplate workplate = new Workplate();workplate.setDepth((int) (new Random().nextDouble() * 100));workplate.setType("square");workplate.setWidth((int) (new Random().nextDouble() * 100));workplate.setZoneCols(new Random().nextInt(5));workplate.setZoneOverlap(new Random().nextInt(5));workplate.setZoneRows(new Random().nextInt(5));PrinterZoneInfo[] zones = new PrinterZoneInfo[2]; // 假设有两个zonefor (int i = 0; i < zones.length; i++) {PrinterZoneInfo zone = new PrinterZoneInfo();zone.setColId(new Random().nextInt(10));zone.setRowId(new Random().nextInt(10));zone.setDepth(new Random().nextDouble() * 100);zone.setWidth(new Random().nextDouble() * 100);zone.setX0(new Random().nextDouble() * 100);zone.setY0(new Random().nextDouble() * 100);zones[i] = zone;}workplate.setZones(zones);printerFormat.setWorkplate(workplate);return printerFormat;}/*** 生成打印机事件数据* @return*/private JobTaskDTO generateJobDataTask() {JobTaskDTO jobTaskDTO = new JobTaskDTO();jobTaskDTO.setSn("SN20241111");jobTaskDTO.setCurrentJobId("_240904_114708");jobTaskDTO.setCurrentJobName("auto_240904_1147");jobTaskDTO.setCurrentJobLayerHeight(0.029999999329447746);jobTaskDTO.setCurrentJobStartLayer(new Random().nextInt(769) + 1); // 假设起始层数是1到769之间的随机数jobTaskDTO.setCurrentJobCurrentLayer(new Random().nextInt(769) + 1); // 假设当前层数是1到769之间的随机数jobTaskDTO.setCurrentJobStartTime(new Date()); // 当前时间jobTaskDTO.setCurrentJobEndTime(addHours(jobTaskDTO.getCurrentJobStartTime(), 2)); // 两小时后的时间jobTaskDTO.setCurrentJobEstimateTime(addHours(jobTaskDTO.getCurrentJobStartTime(), 4)); // 四小时后的时间jobTaskDTO.setCurrentJobMaxLayerNo(769);jobTaskDTO.setUpdTime(new Date());jobTaskDTO.setIsFinish(new Random().nextInt(2)); // 0或1jobTaskDTO.setIsOld(new Random().nextInt(2)); // 0或1jobTaskDTO.setCurrentJobPowderUsage(Math.random() * 100); // 假设粉末使用量是0到100之间的随机数return jobTaskDTO;}/*** 生成打印机事件模拟数据所用的方法,用于给时间往后推x小时* @param date* @param hours* @return*/private Date addHours(Date date, int hours) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.HOUR_OF_DAY, hours);return cal.getTime();}private PrinterStatisticsDTO generatePrinterStatisticsData() {PrinterStatisticsDTO dto = new PrinterStatisticsDTO();dto.setSn("SN20241111");Random random = new Random();dto.setWorkTimeLong(String.valueOf(random.nextInt(900) + 100));dto.setIdleTimeLong(String.valueOf(random.nextInt(900) + 100));DecimalFormat decimalFormat = new DecimalFormat("0.00000000");dto.setPowderUsage(Double.valueOf(decimalFormat.format(Math.random())));dto.setPrintWeight(0.0);dto.setDate(new Date());return dto;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13380.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot编程训练系统:性能优化实践

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足&#xff0c;创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…

电子应用产品设计方案-4:基于物联网和人工智能的温度控制器设计方案

一、概述 本温度控制器旨在提供高精度、智能化、远程可控的温度调节解决方案&#xff0c;适用于各种工业和民用场景。 二、系统组成 1. 传感器模块 - 采用高精度的数字式温度传感器&#xff0c;如 TMP117&#xff0c;能够提供精确到 0.01C 的温度测量。 - 配置多个传感器分布在…

如何在 Ubuntu 24.04 上安装和配置 Fail2ban ?

确保你的 Ubuntu 24.04 服务器的安全是至关重要的&#xff0c;特别是如果它暴露在互联网上。一个常见的威胁是未经授权的访问尝试&#xff0c;特别是通过 SSH。Fail2ban 是一个强大的工具&#xff0c;可以通过自动阻止可疑活动来帮助保护您的服务器。 在本指南中&#xff0c;我…

同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡

1路DP/HDMI/TYPE-C&#xff08;手机/平板等&#xff09;视频信号输入1路MIC1路LINE OUT,带1路HDMI环出&#xff0c;USB免驱&#xff0c;分辨率4K60&#xff0c;可采集3路信号中其中1路&#xff0c;按钮切换&#xff0c;可采集带TYPE-C接口的各品牌手机/平板/笔记本电脑等 同三维…

Kafka--关于broker的夺命连环问

目录 1、zk在kafka集群中有何作用 2、简述kafka集群中的Leader选举机制 3、kafka是如何处理数据乱序问题的。 4、kafka中节点如何服役和退役 4.1 服役新节点 1&#xff09;新节点准备 2&#xff09;执行负载均衡操作 4.2 退役旧节点 5、Kafka中Leader挂了&#xff0c;…

Web项目版本更新及时通知

背景 单页应用&#xff0c;项目更新时&#xff0c;部分用户会出更新不及时&#xff0c;导致异常的问题。 技术方案 给出版本号&#xff0c;项目每次更新时通知用户&#xff0c;版本已经更新需要刷新页面。 版本号更新方案版本号变更后通知用户哪些用户需要通知&#xff1f;…

Android音视频直播低延迟探究之:WLAN低延迟模式

Android WLAN低延迟模式 Android WLAN低延迟模式是 Android 10 引入的一种功能&#xff0c;允许对延迟敏感的应用将 Wi-Fi 配置为低延迟模式&#xff0c;以减少网络延迟&#xff0c;启动条件如下&#xff1a; Wi-Fi 已启用且设备可以访问互联网。应用已创建并获得 Wi-Fi 锁&a…

Appium配置2024.11.12

百度得知&#xff1a;谷歌从安卓9之后不再提供真机layout inspector查看&#xff0c;仅用于支持ide编写的app调试用 所以最新版android studio的android sdk目录下已经没有了布局查看工具... windows x64操作系统 小米k30 pro手机 安卓手机 Android 12 第一步&#xff1a…

前端使用Canvas实现网页电子签名(兼容移动端和PC端)

实现效果&#xff1a; 要使用Canvas实现移动端网页电子签名&#xff0c;可以按照以下步骤&#xff1a; 在HTML文件中创建一个Canvas元素&#xff0c;并设置其宽度和高度&#xff0c;以适配移动设备的屏幕大小。 // 创建一个canvas元素 let canvas document.createElement(&q…

使用 Python 实现高效网页爬虫——从获取链接到数据保存

前言 在这个时代,网络爬虫已成为数据分析与信息收集不可或缺的技术之一。本文将通过一个具体的Python项目来介绍如何构建一个简单的网络爬虫,它能够自动抓取指定网站的文章链接、标题、正文内容以及图片链接,并将这些信息保存为CSV文件。 目标网站 一、准备工作 在开始编…

跟着尚硅谷学vue2—进阶版4.0—Vuex1.0

5. Vuex 1. 理解 Vuex 1. 多组件共享数据-全局事件总线实现 红线是读&#xff0c;绿线是写 2. 多组件共享数据-vuex实现 vuex 不属于任何组件 3. 求和案例-纯vue版 核心代码 1.Count.vue <template><div><h1>当前求和为&#xff1a;{{ sum }}</h1&…

HTML之列表

练习题&#xff1a; 图所示为一个问卷调查网页&#xff0c;请制作出来。要求&#xff1a;大标题用h1标签&#xff1b;小题目用h3标签&#xff1b;前两个问题使用有序列表&#xff1b;最后一个问题使用无序列表。 代码&#xff1a; <!DOCTYPE html> <html> <he…

如何编写jenkins的流水线

如何编写jenkins的流水线 我们为什么需要编写流水线&#xff1f;新建一个jenkins pipeline的item初识pipeline界面pipeline代码关于取值声明和定义工具使用数据结构 我们为什么需要编写流水线&#xff1f; 这里假如你已经安装了好了jenkins&#xff0c;并且能够正常启动它。 通…

项目管理人员的自我评估与职业目标设定

在当今快速发展的商业环境中&#xff0c;项目管理人员的职业规划至关重要。它不仅涉及到个人职业发展的方向、目标和路径选择&#xff0c;还包括如何提升自身的专业技能、管理能力和行业知识。项目管理人员需要明确自己的职业目标、制定合理的职业发展计划、不断学习新知识和技…

状态空间方程离散化(Matlab符号函数)卡尔曼

// 卡尔曼滤波(4)&#xff1a;扩展卡尔曼滤波 - 知乎 // // matlab 连续系统状态空间表达式的离散化&状态转移矩阵求解_matlab状态方程离散化-CSDN博客 // // // %https://blog.csdn.net/weixin_44051006/article/details/107007916 clear all; clc; syms R1 R2 C1 C…

ubuntu24.04播放语音视频

直接打开ubuntu自带的video播放.mp4文件&#xff0c;弹窗报错如下&#xff1a; 播放此影片需要插件 MPEG-4 AAC 编码器安装方式&#xff1a; sudo apt install gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt install ffmpeg验证AA…

音视频入门基础:MPEG2-TS专题(4)——使用工具分析MPEG2-TS传输流

一、引言 有很多工具可以分析MPEG2-TS文件/流&#xff0c;比如Elecard Stream Analyzer、PROMAX TS Analyser、easyice等。下面一一对它们进行简介&#xff08;个人感觉easyice功能更强大一点&#xff09;。 二、Elecard Stream Analyzer 使用Elecard Stream Analyzer工具可以…

C++基础 抽象类 类模板 STL库 QT环境

一、抽象类 1、纯虚函数 在多态中&#xff0c;通常父类中虚函数的实现是毫无意义的&#xff0c;主要都是调用子类重写的内容&#xff0c;因此可以将虚函数改为纯虚函数。 语法&#xff1a; virtual 返回值类型 函数名 (参数列表) 0; 2. 抽象类 1) 概念 有纯虚函数所在的类…

c语言选择排序

选择排序思想&#xff1a; 反复地从未排序部分选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其放到已排序部分的末尾&#xff1b; 首先用一个变量min来保存数组第一个元素的下标&#xff0c;然后用这个下标访问这个元素&#xff0c;将这个元素与它后面的元素相…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性&#xff0c;主要有cell&#xff0c;net&#xff0c;PG Net&#xff0c;Pin&#xff0c;时钟clock&#xff0c;时序库lib属性&#xff0c;Design属性&#xff0c;timing path&#xff0c;timin arc等…