pom.xml
@@ -99,12 +99,6 @@ <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.14</version> </dependency> <!-- 动态数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.5.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> src/main/java/com/ard/alarm/camera/mapper/ArdCamerasMapper.java
@@ -2,7 +2,6 @@ import java.util.List; import com.ard.alarm.camera.domain.ArdCameras; import com.baomidou.dynamic.datasource.annotation.DS; import org.apache.ibatis.annotations.Mapper; /** @@ -12,7 +11,6 @@ * @date 2023-02-11 */ @Mapper @DS("master") public interface ArdCamerasMapper { /** src/main/java/com/ard/alarm/digitization/mapper/DataBridgeMapper.java
@@ -1,11 +1,9 @@ package com.ard.alarm.digitization.mapper; import com.ard.alarm.digitization.model.DataBridge; import com.baomidou.dynamic.datasource.annotation.DS; import org.apache.ibatis.annotations.Mapper; import java.util.List; @DS("oracle") @Mapper public interface DataBridgeMapper { src/main/java/com/ard/alarm/digitization/service/impl/DataBridgeServiceImpl.java
@@ -1,20 +1,19 @@ package com.ard.alarm.digitization.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ard.alarm.digitization.mapper.DataBridgeMapper; import com.ard.alarm.digitization.model.DataBridge; import com.ard.alarm.digitization.service.DataBridgeService; import com.ard.alarm.stealelec.domain.ArdAlarmStealelec; import com.ard.utils.jdbc.Query; import com.ard.utils.mqtt.MqttConsumer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; import java.util.Map; /** * @Description: @@ -23,29 +22,45 @@ * @Date: 2023年09月18日16:41:50 **/ @Service @Slf4j(topic = "alarm") @Slf4j(topic = "digitization3") public class DataBridgeServiceImpl implements DataBridgeService { @Resource DataBridgeMapper databridgeMapper; public static Date lastTime; @Value("${spring.digitization3.enabled}") private Boolean enabled; @Scheduled(cron = "0/5 * * * * ?") public void alarmHandler() { List<DataBridge> dataBridgeList; try { List<DataBridge> dataBridgeList = selectDatabridgeList(new DataBridge()); if(!enabled) { return; } if (lastTime == null) { //初次查询,只获取10条最近数据。 dataBridgeList = Query.getAlarmData(null, 10); if (dataBridgeList.size() > 0) { lastTime = dataBridgeList.get(0).getDateTime(); } } else { //查询大于上次查询最后一条数据的时间 dataBridgeList = Query.getAlarmData(lastTime, null); } if (dataBridgeList.size() > 0) { for (DataBridge data : dataBridgeList) { String[] elem = data.getValue().split(";"); data.setWellNo(elem[0]); data.setAlarmType(elem[1]); data.setAlarmTime(elem[2]); MqttConsumer.publish(2, false, "digitization3", JSON.toJSONString(data)); } } } catch (Exception ex) { log.error("3厂数字化报警数据推送异常:" + ex.getMessage()); log.error("3厂数字化报警数据处理异常:" + ex.getMessage()); } } src/main/java/com/ard/alarm/external/mapper/ArdEquipExternalMapper.java
@@ -2,7 +2,6 @@ import java.util.List; import com.ard.alarm.external.domain.ArdEquipExternal; import com.baomidou.dynamic.datasource.annotation.DS; import org.apache.ibatis.annotations.Mapper; @@ -13,7 +12,6 @@ * @date 2023-03-13 */ @Mapper @DS("master") public interface ArdEquipExternalMapper { /** src/main/java/com/ard/alarm/radar/mapper/ArdEquipRadarMapper.java
@@ -2,7 +2,6 @@ import java.util.List; import com.ard.alarm.radar.domain.ArdEquipRadar; import com.baomidou.dynamic.datasource.annotation.DS; import org.apache.ibatis.annotations.Mapper; /** @@ -12,7 +11,6 @@ * @date 2023-03-11 */ @Mapper @DS("master") public interface ArdEquipRadarMapper { /** src/main/java/com/ard/alarm/stealelec/service/StealElecAlarmService.java
@@ -10,6 +10,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -24,12 +25,15 @@ */ @Slf4j(topic = "stealAlarm") @Service public class StealElecAlarmService{ public class StealElecAlarmService { @Resource RestTemplate restTemplate; @Value("${spring.stealelec.url}") private String stealElecUrl; List<String> tempList=new ArrayList<>(); @Value("${spring.stealelec.enabled}") private Boolean enabled; List<String> tempList = new ArrayList<>(); /** * @描述 获取api数据推送mqtt * @参数 [] @@ -39,9 +43,12 @@ * @修改人和其它信息 */ @Async("alarm") // @Scheduled(cron="0/5 * * * * ?") @Scheduled(cron = "0/5 * * * * ?") public void alarmHandler() { try { if (!enabled) { return; } String allAlarmData = restTemplate.getForObject(stealElecUrl, String.class); //剔除所有\符号 String message = allAlarmData.replaceAll("\\\\", ""); @@ -60,11 +67,10 @@ String JSONStr = JSON.toJSONString(object); //转成实体对象 ArdAlarmStealelec wd = JSON.parseObject(JSONStr, ArdAlarmStealelec.class); if(tempList.contains(wd.getId())) { if (tempList.contains(wd.getId())) { continue; } MqttConsumer.publish(2,false,"stealelec", JSON.toJSONString(wd)); MqttConsumer.publish(2, false, "stealelec", JSON.toJSONString(wd)); tempList.add(wd.getId()); } } src/main/java/com/ard/config/DruidConfig.java
File was deleted src/main/java/com/ard/utils/jdbc/Conn.java
New file @@ -0,0 +1,103 @@ package com.ard.utils.jdbc; /** * @Description: * @ClassName: GetConn * @Author: 刘苏义 * @Date: 2023年09月19日13:12:38 **/ import org.springframework.core.io.ClassPathResource; import javax.annotation.Resource; import java.sql.*; import java.util.Properties; public class Conn { //jdbc连接需要用到的三个参数 private String url="jdbc:oracle:thin:@//112.98.126.2:21521/orcl"; private String user="c##ard_user"; private String pwd="123456"; //创建一个对象 设置为静态私有 (单例模式) private static Conn gc=null; //将构造函数设为private型 防止外部实例化对象 (通过反射或反序列化可以破解单例) private Conn(){}; //静态代码块,在类加载进内存时就完成对对象的特殊的初始化(这个动作发生在类的构造器执行之前,也就是在没有对象存在的情况下,静态代码就已经完成了对对象的特殊的处理 ),此处的作用是,当jdbc的驱动器加载时,就自动创建一个自己。 static{ try { //注册驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //判断GetConn实例化的对象是否存在 不存在就实例化一个 //synchronized 线程锁 防止多个线程抢占资源 防止死锁 public static Conn getGc(){ if(gc==null){ synchronized (Conn.class) { if(gc==null){ gc=new Conn(); } } } return gc; } //返回一个Connection连接 public Connection getCon() throws SQLException{ return DriverManager.getConnection(url, user, pwd); } //释放资源 public void closeAll(ResultSet rs, Statement st, Connection con){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(st!=null){ try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } if(st!=null){ try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } src/main/java/com/ard/utils/jdbc/Query.java
New file @@ -0,0 +1,72 @@ package com.ard.utils.jdbc; /** * @Description: * @ClassName: Query * @Author: 刘苏义 * @Date: 2023年09月19日13:01:28 **/ import com.ard.alarm.digitization.model.DataBridge; import lombok.extern.slf4j.Slf4j; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j(topic = "digitization3") public class Query { static Connection conn = null; static Statement st = null; static ResultSet rs = null; public static List<DataBridge> getAlarmData(Date alarmTime, Integer rowNum) { List<DataBridge> dataBridgeList = new ArrayList<>(); try { //1、获取连接对象 conn = Conn.getGc().getCon(); //2、创建statement类对象,用来执行SQL语句 st = conn.createStatement(); //3、创建sql查询语句 StringBuilder sbd = new StringBuilder(); String sql = "select * from (select * from DATABRIDGE order by DB_DATETIME desc ) where 1=1 "; sbd.append(sql); if (rowNum != null) { sbd.append(" and rownum <" + rowNum); } if (alarmTime != null) { SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String Time = fmt.format(alarmTime); sbd.append(" and DB_DATETIME > to_date('" + Time + "','yyyy/mm/dd hh24:mi:ss')"); } //4、执行sql语句并且换回一个查询的结果集 rs = st.executeQuery(sbd.toString()); while (rs.next()) { //循环遍历结果集 DataBridge dataBridge = new DataBridge(); dataBridge.setId(rs.getString("DB_GUID")); dataBridge.setXmmc(rs.getString("DB_XMMC")); dataBridge.setFKey(rs.getString("DB_FKEY")); dataBridge.setFName(rs.getString("DB_FNAME")); dataBridge.setValue(rs.getString("DB_VALUE")); dataBridge.setDateTime(rs.getTimestamp("DB_DATETIME")); dataBridgeList.add(dataBridge); } return dataBridgeList; } catch (Exception e) { log.error("三厂数字化报警查询异常:" + e.getMessage()); return dataBridgeList; } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } src/main/resources/application-dev.yml
@@ -9,90 +9,26 @@ max-file-size: 30MB max-request-size: 30MB datasource: dynamic: primary: postgres #设置默认的数据源或者数据源组 strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 druid: # 全局druid参数,单独数据源配置为空时取全局配置 # 连接池的配置信息 # 初始化大小,最小,最大 initial-size: 1 min-idle: 2 maxActive: 8 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 datasource: master: url: jdbc:postgresql://192.168.2.15:5432/ry-vue username: postgres password: postgres driver-class-name: org.postgresql.Driver druid: # 配置multi-datasource1 数据源连接池参数 # 连接池的配置信息 # 初始化大小,最小,最大 initial-size: 2 min-idle: 2 maxActive: 2 # 配置获取连接等待超时的时间 maxWait: 600000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 oracle: url: jdbc:oracle:thin:@//112.98.126.2:21521/orcl username: c##ard_user password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver druid: #配置mysql 默认连接池参数 # 连接池的配置信息 # 初始化大小,最小,最大 initial-size: 3 min-idle: 3 maxActive: 8 # 配置获取连接等待超时的时间 maxWait: 600000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 druid: #开启druid监控web stat-view-servlet: enabled: true driver-class-name: org.postgresql.Driver url: jdbc:postgresql://192.168.2.15:5432/ry-vue username: postgres password: postgres #最大连接数 maxActive: 30 #最小连接数 minIdle: 5 #获取连接的最大等待时间 maxWait: 10000 #解决mysql8小时的问题 validation-query: SELECT 'X' #空闲连接的检查时间间隔 timeBetweenEvictionRunsMillis: 60000 #空闲连接最小空闲时间 minEvictableIdleTimeMillis: 300000 # netty配置 netty: udp: @@ -112,7 +48,11 @@ enabled: true # 盗电接口地址 stealelec: enabled: false url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil # 三厂数字化地址 digitization3: enabled: true # minio配置 minio: endpoint: http://192.168.2.15:9001 @@ -126,8 +66,10 @@ logging: level: hikSdk: info mqtt: debug netty: debug mqtt: info netty: info external: info camera: info tube: info digitization3: debug stealAlarm: info src/main/resources/application-prod.yml
@@ -49,8 +49,13 @@ timeout: 100 keepalive: 60 enabled: true # 盗电接口地址 stealelec: enabled: false url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil # 三厂数字化地址 digitization3: enabled: false mybatis: typeAliasesPackage: com.ard.alarm.**.domain mapperLocations: classpath:/mapper/*.xml @@ -60,7 +65,7 @@ logging: level: hikSdk: debug mqtt: info mqtt: debug netty: info external: info camera: info src/main/resources/logback-spring.xml
@@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration> <!--日志存放路径--> <property name="log.path" value="./alarmLogs"/> <property name="log.path" value="./logs"/> <!--日志输出格式--> <property name="log.pattern" value="%d{HH:mm:ss.SSS}[%thread]%-5level%logger{20}-[%method,%line]-%msg%n"/> <!--控制台输出--> @@ -45,14 +45,6 @@ <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤的级别--> <level>INFO</level> <!--匹配时的操作:接收(记录)--> <onMatch>ACCEPT</onMatch> <!--不匹配时的操作:拒绝(不记录)--> <onMismatch>DENY</onMismatch> </filter> </appender> <!--通用光电报警日志输出--> <appender name="camera" class="ch.qos.logback.core.rolling.RollingFileAppender"> @@ -67,14 +59,6 @@ <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤的级别--> <level>INFO</level> <!--匹配时的操作:接收(记录)--> <onMatch>ACCEPT</onMatch> <!--不匹配时的操作:拒绝(不记录)--> <onMismatch>DENY</onMismatch> </filter> </appender> <!--外联设备报警日志输出--> <appender name="external" class="ch.qos.logback.core.rolling.RollingFileAppender"> @@ -89,14 +73,6 @@ <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤的级别--> <level>INFO</level> <!--匹配时的操作:接收(记录)--> <onMatch>ACCEPT</onMatch> <!--不匹配时的操作:拒绝(不记录)--> <onMismatch>DENY</onMismatch> </filter> </appender> <!--Netty日志输出--> <appender name="netty" class="ch.qos.logback.core.rolling.RollingFileAppender"> @@ -111,16 +87,8 @@ <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤的级别--> <level>INFO</level> <!--匹配时的操作:接收(记录)--> <onMatch>ACCEPT</onMatch> <!--不匹配时的操作:拒绝(不记录)--> <onMismatch>DENY</onMismatch> </filter> </appender> <!--Mqtt日志输出--> <!--mqtt日志输出--> <appender name="mqtt" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/mqtt.log</file> <!--循环政策:基于时间创建日志文件--> @@ -133,14 +101,6 @@ <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤的级别--> <level>INFO</level> <!--匹配时的操作:接收(记录)--> <onMatch>ACCEPT</onMatch> <!--不匹配时的操作:拒绝(不记录)--> <onMismatch>DENY</onMismatch> </filter> </appender> <!--hikSdk日志输出--> <appender name="hikSdk" class="ch.qos.logback.core.rolling.RollingFileAppender"> @@ -155,6 +115,33 @@ <pattern>${log.pattern}</pattern> </encoder> </appender> <!--stealAlarm日志输出--> <appender name="stealAlarm" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/stealAlarm.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--按天回滚daily--> <fileNamePattern>${log.path}/stealAlarm.%d{yyyy-MM-dd}.log</fileNamePattern> <!--日志最大的历史60天--> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!--digitization3日志输出--> <appender name="digitization3" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/digitization3.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--按天回滚daily--> <fileNamePattern>${log.path}/digitization3.%d{yyyy-MM-dd}.log</fileNamePattern> <!--日志最大的历史60天--> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="console"/> </root> @@ -162,5 +149,39 @@ <root level="INFO"> <appender-ref ref="sys-info"/> </root> <!--tube操作日志--> <logger name="tube" level="INFO"> <appender-ref ref="tube"/> </logger> <!--camera操作日志--> <logger name="camera" level="INFO"> <appender-ref ref="camera"/> </logger> <!--external操作日志--> <logger name="external" level="INFO"> <appender-ref ref="external"/> </logger> <!--netty操作日志--> <logger name="netty" level="INFO"> <appender-ref ref="netty"/> </logger> <!--mqtt操作日志--> <logger name="mqtt" level="DEBUG"> <appender-ref ref="mqtt"/> </logger> <!--hikSdk操作日志--> <logger name="hikSdk" level="INFO"> <appender-ref ref="hikSdk"/> </logger> <!--digitization3操作日志--> <logger name="digitization3" level="INFO"> <appender-ref ref="digitization3"/> </logger> <!--stealAlarm操作日志--> <logger name="stealAlarm" level="INFO"> <appender-ref ref="stealAlarm"/> </logger> </configuration>