Browse Source

格式化代码

lgy 4 years ago
parent
commit
bf9f168f74
46 changed files with 1087 additions and 1112 deletions
  1. 6 5
      .mvn/wrapper/MavenWrapperDownloader.java
  2. 3 3
      docker/zkt-project-alarm.yml
  3. 35 35
      pom.xml
  4. 63 59
      src/main/java/com/persagy/cache/AlarmInfoCache.java
  5. 11 11
      src/main/java/com/persagy/cache/CurrentDataCache.java
  6. 16 16
      src/main/java/com/persagy/client/GroupNettyClient.java
  7. 14 16
      src/main/java/com/persagy/client/GroupNettyClientHandler.java
  8. 26 35
      src/main/java/com/persagy/client/WebSocketClientFactory.java
  9. 68 69
      src/main/java/com/persagy/config/QuartzConfiguration.java
  10. 82 77
      src/main/java/com/persagy/controller/HelloWorld.java
  11. 23 20
      src/main/java/com/persagy/demo/netty/websocket/client/WebSocketClient.java
  12. 1 2
      src/main/java/com/persagy/demo/netty/websocket/client/WebSocketClientHandler.java
  13. 3 2
      src/main/java/com/persagy/demo/netty/websocket/server/MyChannelHandlerPool.java
  14. 29 29
      src/main/java/com/persagy/demo/netty/websocket/server/MyWebSocketHandler.java
  15. 29 33
      src/main/java/com/persagy/entity/AlarmDefine.java
  16. 0 9
      src/main/java/com/persagy/entity/AlarmRecord.java
  17. 20 18
      src/main/java/com/persagy/entity/AlarmState.java
  18. 30 30
      src/main/java/com/persagy/entity/Condition.java
  19. 1 0
      src/main/java/com/persagy/entity/ExpireAlarmMessage.java
  20. 9 15
      src/main/java/com/persagy/entity/NettyMessage.java
  21. 4 1
      src/main/java/com/persagy/entity/ZktAlarmRecordDO.java
  22. 17 18
      src/main/java/com/persagy/init/InitRunner.java
  23. 41 45
      src/main/java/com/persagy/job/AlarmExpireJob.java
  24. 8 8
      src/main/java/com/persagy/job/AlarmMessageThread.java
  25. 23 16
      src/main/java/com/persagy/job/ExpireAlarmQueue.java
  26. 23 16
      src/main/java/com/persagy/job/NettyMessageQueue.java
  27. 8 11
      src/main/java/com/persagy/job/SpringSchedule.java
  28. 2 3
      src/main/java/com/persagy/repository/AlarmRecordRepository.java
  29. 3 7
      src/main/java/com/persagy/service/impl/AlarmDefineServiceImpl.java
  30. 45 46
      src/main/java/com/persagy/service/impl/AlarmHandleServiceImpl.java
  31. 16 17
      src/main/java/com/persagy/service/impl/AlarmQuartzServiceImpl.java
  32. 7 8
      src/main/java/com/persagy/service/impl/RunScriptExample.java
  33. 9 8
      src/main/java/com/persagy/utils/DataUtils.java
  34. 312 318
      src/main/java/com/persagy/utils/DateUtils.java
  35. 32 32
      src/main/java/com/persagy/utils/GZIPCompressUtil.java
  36. 20 21
      src/main/java/com/persagy/utils/LockUtil.java
  37. 7 7
      src/main/java/com/persagy/utils/NetworkUtil.java
  38. 8 9
      src/main/java/com/persagy/utils/StringUtil.java
  39. 3 3
      src/main/resources/application-39Pj1101050013.yml
  40. 2 2
      src/main/resources/application-39Pj5001120003.yml
  41. 2 2
      src/main/resources/application-Pj1101080259.yml
  42. 3 3
      src/main/resources/application-Pj4403070003.yml
  43. 2 2
      src/main/resources/application-Pj5001120003.yml
  44. 2 2
      src/main/resources/application-testPj1101080259.yml
  45. 10 13
      src/main/resources/quartz.properties
  46. 9 10
      src/test/java/com/persagy/zktprojectalarm/Mytest.java

+ 6 - 5
.mvn/wrapper/MavenWrapperDownloader.java

@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 import java.net.*;
 import java.io.*;
 import java.nio.channels.*;
@@ -25,7 +26,7 @@ public class MavenWrapperDownloader {
      * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
      */
     private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
-        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+            + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
 
     /**
      * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
@@ -54,7 +55,7 @@ public class MavenWrapperDownloader {
         // wrapperUrl parameter.
         File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
         String url = DEFAULT_DOWNLOAD_URL;
-        if(mavenWrapperPropertyFile.exists()) {
+        if (mavenWrapperPropertyFile.exists()) {
             FileInputStream mavenWrapperPropertyFileInputStream = null;
             try {
                 mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
@@ -65,7 +66,7 @@ public class MavenWrapperDownloader {
                 System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
             } finally {
                 try {
-                    if(mavenWrapperPropertyFileInputStream != null) {
+                    if (mavenWrapperPropertyFileInputStream != null) {
                         mavenWrapperPropertyFileInputStream.close();
                     }
                 } catch (IOException e) {
@@ -76,8 +77,8 @@ public class MavenWrapperDownloader {
         System.out.println("- Downloading from: " + url);
 
         File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
-        if(!outputFile.getParentFile().exists()) {
-            if(!outputFile.getParentFile().mkdirs()) {
+        if (!outputFile.getParentFile().exists()) {
+            if (!outputFile.getParentFile().mkdirs()) {
                 System.out.println(
                         "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
             }

+ 3 - 3
docker/zkt-project-alarm.yml

@@ -4,9 +4,9 @@ services:
     image: labisenlin.persagy.com/integrated-public/zkt-project-alarm:${tag}
     container_name: zkt-project-alarm_${PROJECT_ID}
     restart: always
-#    ports:
-#      # 服务暴露端口号,按环境调整,
-#      - 9984:9984
+    #    ports:
+    #      # 服务暴露端口号,按环境调整,
+    #      - 9984:9984
     volumes:
       # zkt-project-alarm.yml 文件同级放config文件夹,文件夹下有 要包含application.yml文件
       - ./config/:${WORKER_HOME}/config/

+ 35 - 35
pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.springframework.boot</groupId>
@@ -83,11 +83,11 @@
             <artifactId>Java-WebSocket</artifactId>
             <version>1.3.8</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>junit</groupId>-->
-<!--            <artifactId>junit</artifactId>-->
-<!--        </dependency>-->
-       <!-- commons-lang3常用工具类-->
+        <!--        <dependency>-->
+        <!--            <groupId>junit</groupId>-->
+        <!--            <artifactId>junit</artifactId>-->
+        <!--        </dependency>-->
+        <!-- commons-lang3常用工具类-->
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
@@ -117,17 +117,17 @@
             <artifactId>mysql-connector-java</artifactId>
             <scope>runtime</scope>
         </dependency>
-       <!--  Spring Boot JDBC-->
-          <dependency>
+        <!--  Spring Boot JDBC-->
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-jdbc</artifactId>
         </dependency>
         <!-- 数据库连接池-->
-       <dependency>
-           <groupId>com.alibaba</groupId>
-           <artifactId>druid-spring-boot-starter</artifactId>
-           <version>1.1.22</version>
-       </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.22</version>
+        </dependency>
         <!-- spring-data-jpa -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -142,27 +142,27 @@
             <artifactId>autologging-aop</artifactId>
             <version>1.0.0</version>
         </dependency>
-   </dependencies>
+    </dependencies>
 
-   <build>
-       <finalName>${project.artifactId}</finalName>
-       <plugins>
-           <plugin>
-               <groupId>org.apache.maven.plugins</groupId>
-               <artifactId>maven-compiler-plugin</artifactId>
-               <version>3.8.1</version>
-               <configuration>
-                   <source>1.8</source>
-                   <target>1.8</target>
-                   <encoding>UTF-8</encoding>
-                   <skip>true</skip>
-               </configuration>
-           </plugin>
-           <plugin>
-               <groupId>org.springframework.boot</groupId>
-               <artifactId>spring-boot-maven-plugin</artifactId>
-           </plugin>
-       </plugins>
-   </build>
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

+ 63 - 59
src/main/java/com/persagy/cache/AlarmInfoCache.java

@@ -2,14 +2,12 @@ package com.persagy.cache;
 
 
 import cn.hutool.core.collection.CollectionUtil;
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.Expression;
 import com.persagy.entity.AlarmDefine;
 import com.persagy.entity.AlarmState;
 import com.persagy.entity.Condition;
-import com.persagy.utils.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
@@ -42,18 +40,31 @@ public class AlarmInfoCache {
     private ConcurrentHashMap<String, List<AlarmDefine>> infoAlarmMap = new ConcurrentHashMap<>();
 
 
-
     /**
      * 报警定义  <报警定义标识,报警时间状态>
      * 报警定义标识默认为:报警编码-报警对象id
      */
     private ConcurrentHashMap<String, AlarmState> alarmStateMap = new ConcurrentHashMap<>();
+
     /**
-     * @description:获取报警状态  <报警定义标识,报警时间状态>
+     * @param alarmDefine:
+     * @description:获取报警定义id, 中台报警定义ID没有实际意义,根据itemCode-objId-targetId拼接作为唯一标识
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/19 17:28
+     * @version: V1.0
+     */
+    public static String getAlarmDefineId(AlarmDefine alarmDefine) {
+        return alarmDefine.getItemCode() + "-" + alarmDefine.getObjId() + "-" + alarmDefine.getTargetId();
+    }
+
+    /**
      * @param :
+     * @description:获取报警状态 <报警定义标识,报警时间状态>
+     * @exception:
+     * @author: LuoGuangyi
+     * @company: Persagy Technology Co.,Ltd
      * @return: null
      * @since: 2020/10/20 17:12
      * @version: V1.0
@@ -61,44 +72,52 @@ public class AlarmInfoCache {
     public AlarmState getAlarmState(String definitionId) {
         return alarmStateMap.get(definitionId);
     }
+
     /**
+     * @param definitionId: 报警定义id
+     * @param alarmState:   报警状态时间类
      * @description:设置报警定义
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param definitionId: 报警定义id
-     * @param alarmState: 报警状态时间类
      * @return: com.persagy.entity.AlarmState
      * @since: 2020/10/20 17:15
      * @version: V1.0
      */
-    public AlarmState setAlarmState(String definitionId,AlarmState alarmState) {
-        return alarmStateMap.put(definitionId,alarmState);
+    public AlarmState setAlarmState(String definitionId, AlarmState alarmState) {
+        return alarmStateMap.put(definitionId, alarmState);
     }
 
     /**
      * 获取报警定义Map <报警定义标识,报警定义详情>
+     *
      * @return
      */
     public ConcurrentHashMap<String, AlarmDefine> getAlarmDefineMap() {
         return alarmDefineMap;
     }
+
     /**
      * 设置报警定义Map <报警定义标识,报警定义详情>
+     *
      * @return
      */
     public void setAlarmDefineMap(ConcurrentHashMap<String, AlarmDefine> alarmDefineMap) {
         this.alarmDefineMap = alarmDefineMap;
     }
+
     /**
      * 获取信息点-报警定义map <表号-功能号,[报警定义1,报警定义2]>
+     *
      * @return
      */
     public ConcurrentHashMap<String, List<AlarmDefine>> getInfoAlarmMap() {
         return infoAlarmMap;
     }
+
     /**
      * 设置信息点-报警定义map <表号-功能号,[报警定义1,报警定义2]>
+     *
      * @return
      */
     public void setInfoAlarmMap(ConcurrentHashMap<String, List<AlarmDefine>> infoAlarmMap) {
@@ -106,11 +125,11 @@ public class AlarmInfoCache {
     }
 
     /**
+     * @param definitionId :
      * @description:根据报警定义id获取报警定义详情
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param definitionId :
      * @return: AlarmDefine 报警定义详情
      * @since: 2020/10/19 14:32
      * @version: V1.0
@@ -119,82 +138,79 @@ public class AlarmInfoCache {
         return alarmDefineMap.get(definitionId);
     }
 
-
     /**
+     * @param definitionId:报警定义ID
+     * @param alarmDefine:报警定义详情
      * @description:保存报警定义详情
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param definitionId:报警定义ID
-     * @param alarmDefine:报警定义详情
      * @return: void
      * @since: 2020/10/19 14:32
      * @version: V1.0
      */
     public void putAlarmDefinitionById(String definitionId, AlarmDefine alarmDefine) {
-        if(alarmDefine.getOpen() == 0){
+        if (alarmDefine.getOpen() == 0) {
             return;
         }
         Condition condition = alarmDefine.getCondition();
         List<JSONObject> infoCodes = condition.getInfoCodes();
-        if(CollectionUtil.isEmpty(infoCodes)) {
-            log.error("报警定义ID为[{}],报警定义详情为[{}] 的报警定义信息点为空,请检查!!!!!  ",definitionId,alarmDefine.toString());
+        if (CollectionUtil.isEmpty(infoCodes)) {
+            log.error("报警定义ID为[{}],报警定义详情为[{}] 的报警定义信息点为空,请检查!!!!!  ", definitionId, alarmDefine.toString());
             return;
         }
         String trigger = condition.getTrigger();
         String end = condition.getEnd();
         try {
-            Expression triggerCompiledExp = AviatorEvaluator.compile(trigger,true);
+            Expression triggerCompiledExp = AviatorEvaluator.compile(trigger, true);
         } catch (Exception e) {
-            log.info("触发表达式:",trigger);
-            log.error("触发表表达式不合法,请校验",e);
-            throw  new IllegalArgumentException("触发表表达式不合法",e);
+            log.info("触发表达式:", trigger);
+            log.error("触发表表达式不合法,请校验", e);
+            throw new IllegalArgumentException("触发表表达式不合法", e);
         }
         try {
-            Expression endCompiledExp = AviatorEvaluator.compile(end,true);
+            Expression endCompiledExp = AviatorEvaluator.compile(end, true);
         } catch (Exception e) {
-            log.error("恢复表达式:",end);
-            log.error("恢复表达式不合法,请校验",e);
-            throw  new IllegalArgumentException("恢复表达式不合法",e);
+            log.error("恢复表达式:", end);
+            log.error("恢复表达式不合法,请校验", e);
+            throw new IllegalArgumentException("恢复表达式不合法", e);
         }
         alarmDefineMap.put(definitionId, alarmDefine);
         for (int i = 0; i < infoCodes.size(); i++) {
             JSONObject infoCode = infoCodes.get(i);
             String meterId = infoCode.getString("meterId");
             String funcId = infoCode.getString("funcId");
-            putAlarmDefinitionIdByMeterFuncId(meterId,funcId,alarmDefine);
+            putAlarmDefinitionIdByMeterFuncId(meterId, funcId, alarmDefine);
         }
     }
+
     public void putAlarmDefinitionById(AlarmDefine alarmDefine) {
-        putAlarmDefinitionById(getAlarmDefineId(alarmDefine),alarmDefine);
+        putAlarmDefinitionById(getAlarmDefineId(alarmDefine), alarmDefine);
     }
 
-
-
     /**
+     * @param meterId: 表号
+     * @param funcId:  功能号
      * @description:根据表号功能号获取多条报警定义id
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param meterId: 表号
-     * @param funcId: 功能号
      * @return: java.util.List<com.alibaba.fastjson.JSONObject>
      * @since: 2020/10/19 14:31
      * @version: V1.0
      */
     public List<AlarmDefine> getAlarmDefinitionIdByMeterFuncId(String meterId, String funcId) {
-        return infoAlarmMap.get(getKey(meterId,funcId));
+        return infoAlarmMap.get(getKey(meterId, funcId));
     }
 
-
     /**
+     * @param meterId:    表号
+     * @param funcId:     功能号
+     * @param definition: 报警定义
      * @description:根据表号功能号缓存报警定义
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param meterId: 表号
-     * @param funcId: 功能号
-     * @param definition: 报警定义
      * @return: void
      * @since: 2020/10/19 14:26
      * @version: V1.0
@@ -205,12 +221,11 @@ public class AlarmInfoCache {
             definitionList = new ArrayList<>();
         }
         //去重并添加
-        definitionList = definitionList.stream().filter(a->!getAlarmDefineId(definition).equals(getAlarmDefineId(a))).collect(Collectors.toList());
+        definitionList = definitionList.stream().filter(a -> !getAlarmDefineId(definition).equals(getAlarmDefineId(a))).collect(Collectors.toList());
         definitionList.add(definition);
-        infoAlarmMap.put(getKey(meterId,funcId), definitionList);
+        infoAlarmMap.put(getKey(meterId, funcId), definitionList);
     }
 
-
     /**
      * @description:删除所有缓存的报警定义
      * @exception:
@@ -226,12 +241,13 @@ public class AlarmInfoCache {
         //清除编译表达式缓存
         AviatorEvaluator.getInstance().clearExpressionCache();
     }
+
     /**
+     * @param ad: 要删除掉的报警定义
      * @description:根据报警定义删除缓存
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param ad:  要删除掉的报警定义
      * @return: void
      * @since: 2020/10/26 20:34
      * @version: V1.0
@@ -239,54 +255,42 @@ public class AlarmInfoCache {
     public void clearAlarmDefine(AlarmDefine ad) {
         String defineId = getAlarmDefineId(ad);
         AlarmDefine alarmDefine = alarmDefineMap.get(defineId);
-        if(!Objects.isNull(alarmDefine)) {
+        if (!Objects.isNull(alarmDefine)) {
             List<JSONObject> infoCodes = alarmDefine.getCondition().getInfoCodes();
-            infoCodes.stream().forEach(info->{
+            infoCodes.stream().forEach(info -> {
                 String meterId = info.getString("meterId");
                 String funcId = info.getString("funcId");
-                List<AlarmDefine> AlarmDefineList = infoAlarmMap.getOrDefault(getKey(meterId, funcId),new ArrayList<>());
+                List<AlarmDefine> AlarmDefineList = infoAlarmMap.getOrDefault(getKey(meterId, funcId), new ArrayList<>());
                 infoAlarmMap.put(getKey(meterId, funcId), AlarmDefineList.stream().filter(adTmp -> !getAlarmDefineId(adTmp).equals(defineId)).collect(Collectors.toList()));
             });
         }
         alarmDefineMap.remove(defineId);
         alarmStateMap.remove(defineId);
     }
-    /**
-     * @description:获取报警定义id,
-     * 中台报警定义ID没有实际意义,根据itemCode-objId-targetId拼接作为唯一标识
-     * @exception:
-     * @author: LuoGuangyi
-     * @company: Persagy Technology Co.,Ltd
-     * @param alarmDefine:
-     * @since: 2020/10/19 17:28
-     * @version: V1.0
-     */
-    public static String getAlarmDefineId(AlarmDefine alarmDefine) {
-        return alarmDefine.getItemCode()+"-"+alarmDefine.getObjId()+"-"+alarmDefine.getTargetId();
-    }
 
     /**
+     * @param meterId:表号
+     * @param funcId:功能号
      * @description:判断是否包含有改表号功能号的改报警定义
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param meterId:表号
-     * @param funcId:功能号
      * @return: boolean
      * @since: 2020/10/19 19:54
      * @version: V1.0
      */
-    public boolean hasKey(String meterId,String funcId) {
-        return infoAlarmMap.containsKey(getKey(meterId,funcId));
+    public boolean hasKey(String meterId, String funcId) {
+        return infoAlarmMap.containsKey(getKey(meterId, funcId));
     }
 
     /**
      * 拼接表号-功能号为一个key
+     *
      * @param meterId
      * @param funcId
      * @return
      */
-    private String getKey(String meterId,String funcId) {
+    private String getKey(String meterId, String funcId) {
         return meterId + "-" + funcId;
     }
 

+ 11 - 11
src/main/java/com/persagy/cache/CurrentDataCache.java

@@ -17,12 +17,12 @@ public class CurrentDataCache {
     private ConcurrentHashMap<String, Double> latestIOTDataMap = new ConcurrentHashMap<>();
 
     /**
+     * @param meterId: 表号
+     * @param funcId:  功能号
      * @description:获取设备实时数据
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param meterId: 表号
-     * @param funcId: 功能号
      * @return: java.lang.String
      * @since: 2020/10/19 16:15
      * @version: V1.0
@@ -31,38 +31,38 @@ public class CurrentDataCache {
         return latestIOTDataMap.get(getKey(meterId, funcId));
     }
 
-    private String getKey(String meterId,String funcId) {
+    private String getKey(String meterId, String funcId) {
         return meterId + "-" + funcId;
     }
 
     /**
+     * @param meterId:     表号
+     * @param funcId:      功能号
+     * @param currentData: 当前值
      * @description:存放实时数据
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param meterId: 表号
-     * @param funcId: 功能号
-     * @param currentData: 当前值
      * @return: void
      * @since: 2020/10/19 16:16
      * @version: V1.0
      */
     public void putCurrentData(String meterId, String funcId, double currentData) {
-        latestIOTDataMap.put(getKey(meterId,funcId), currentData);
+        latestIOTDataMap.put(getKey(meterId, funcId), currentData);
     }
 
     /**
+     * @param meterId:表号
+     * @param funcId:功能号
      * @description:判断是否包含有改表号功能号的数据
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param meterId:表号
-     * @param funcId:功能号
      * @return: boolean
      * @since: 2020/10/19 19:54
      * @version: V1.0
      */
-    public boolean hasKey(String meterId,String funcId) {
-        return latestIOTDataMap.containsKey(getKey(meterId,funcId));
+    public boolean hasKey(String meterId, String funcId) {
+        return latestIOTDataMap.containsKey(getKey(meterId, funcId));
     }
 }

+ 16 - 16
src/main/java/com/persagy/client/GroupNettyClient.java

@@ -15,6 +15,7 @@ import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
 import io.netty.handler.codec.LengthFieldPrepender;
 import io.netty.handler.codec.string.StringDecoder;
 import io.netty.handler.codec.string.StringEncoder;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -31,38 +32,37 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 @Service
 @Slf4j
+@Data
 public class GroupNettyClient {
+    public static Channel channelGroup;
+    //会话对象组
+    public static Map<String, Channel> channelsMap = new ConcurrentHashMap<>();
+    static Bootstrap groupBootstrap = new Bootstrap();
     @Autowired
     AlarmDefineService alarmDefineService;
     @Autowired
     AlarmRecordRepository alarmRecordRepository;
-    static Bootstrap groupBootstrap = new Bootstrap();
-    public static Channel channelGroup;
     @Value("${group.alarm.host:127.0.0.1}")
-    public String host;
+    private String host;
     @Value("${group.alarm.port}")
-    public int port;
+    private int port;
     /**
      * 项目名称
      */
     @Value("${project.id}")
-    public String projectId;
+    private String projectId;
     /**
      * 集团编码
      */
     @Value("${group.code}")
-    public String groupCode;
-
-    //会话对象组
-    public static Map<String, Channel> channelsMap = new ConcurrentHashMap<>();
-
+    private String groupCode;
 
     /**
+     * @param
      * @description:启动netty客户端
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param
      * @return: void
      * @since: 2020/10/20 15:54
      * @version: V1.0
@@ -85,7 +85,7 @@ public class GroupNettyClient {
                             ch.pipeline().addLast(new StringDecoder());
                             ch.pipeline().addLast(new StringEncoder());
                             // pipeline可以理解为所有handler的初始化容器
-                            ch.pipeline().addLast(new GroupNettyClientHandler(groupNettyClient, alarmDefineService,alarmRecordRepository));// 添加自定义handler
+                            ch.pipeline().addLast(new GroupNettyClientHandler(groupNettyClient, alarmDefineService, alarmRecordRepository));// 添加自定义handler
                         }
                     });
             // 连接远程节点,等待连接完成
@@ -139,11 +139,11 @@ public class GroupNettyClient {
         }
     }*/
     public void sendMessage(String msg) throws InterruptedException {
-        log.info("给云端发送数据:[{}]",msg);
-        if(channelGroup.isWritable()){
+        log.info("给云端发送数据:[{}]", msg);
+        if (channelGroup.isWritable()) {
             channelGroup.writeAndFlush(msg);
-        }else {
-            log.warn("云端netty不可写,放入缓冲队列中[{}]",msg);
+        } else {
+            log.warn("云端netty不可写,放入缓冲队列中[{}]", msg);
             NettyMessageQueue.getNettyMessageQueue().produce(msg);
         }
     }

+ 14 - 16
src/main/java/com/persagy/client/GroupNettyClientHandler.java

@@ -18,7 +18,6 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.handler.timeout.IdleState;
 import io.netty.handler.timeout.IdleStateEvent;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.Arrays;
 import java.util.List;
@@ -72,14 +71,14 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
         log.info("Connected to: " + ctx.channel().remoteAddress());
-        ctx.channel().writeAndFlush(new NettyMessage<>(200,groupNettyClient.projectId).toString());
+        ctx.channel().writeAndFlush(new NettyMessage<>(200, groupNettyClient.getProjectId()).toString());
         //启动的时候发送消息,获取全部报警定义
         //{"groupCode":"wd", "projectId":"Pj123"}
-        NettyMessage nettyMessage = new NettyMessage(4,groupNettyClient.projectId);
+        NettyMessage nettyMessage = new NettyMessage(4, groupNettyClient.getProjectId());
         nettyMessage.setRemark("连接已经建立;");
         JSONObject content = new JSONObject();
-        content.put("groupCode", groupNettyClient.groupCode);
-        content.put("projectId", groupNettyClient.projectId);
+        content.put("groupCode", groupNettyClient.getGroupCode());
+        content.put("projectId", groupNettyClient.getProjectId());
         nettyMessage.setContent(Arrays.asList(content));
         log.info(nettyMessage.toString());
         ctx.channel().writeAndFlush(nettyMessage.toString());
@@ -90,13 +89,13 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
         try {
             log.info("--initAlarmResult--");
             TimeInterval timer = DateUtil.timer();
-            while (NettyMessageQueue.getNettyMessageQueue().size()>0 && timer.interval()<10000){
+            while (NettyMessageQueue.getNettyMessageQueue().size() > 0 && timer.interval() < 10000) {
                 String msg = NettyMessageQueue.getNettyMessageQueue().consume();
-                log.info("剩余报警消息令总数:{}",NettyMessageQueue.getNettyMessageQueue().size());
+                log.info("剩余报警消息令总数:{}", NettyMessageQueue.getNettyMessageQueue().size());
                 ctx.writeAndFlush(msg);
             }
         } catch (Exception e) {
-            log.error("发送报警消息失败",e);
+            log.error("发送报警消息失败", e);
         }
     }
 
@@ -109,11 +108,11 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
      */
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
-         log.info("Client received: {}",msg);
+        log.info("Client received: {}", msg);
         try {
             TimeInterval timer = DateUtil.timer();
             handlerMsg(ctx, msg);
-            log.info("处理消息时间[{}]",timer.interval());
+            log.info("处理消息时间[{}]", timer.interval());
         } catch (Exception e) {
             log.error("channelRead", e);
         }
@@ -155,8 +154,8 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
                 if (CollectionUtil.isNotEmpty(definesList)) {
                     alarmDefineService.deleteAlarmDefine(definesList);
                 }
-            }else if (message.getOpCode() == 8) {
-                log.info("-----报警记录id推送----[{}]",message);
+            } else if (message.getOpCode() == 8) {
+                log.info("-----报警记录id推送----[{}]", message);
                 //{"id":"","objId":"","itemCode":""}  id为报警记录ID
                 List content = message.getContent();
                 if (CollectionUtil.isNotEmpty(content)) {
@@ -171,8 +170,7 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
                     alarmRecordRepository.save(zktAlarmRecordDO);
                 }
             }
-            NettyMessage response = new NettyMessage(groupNettyClient.projectId);
-            response.setOpCode(3);
+            NettyMessage response = new NettyMessage(3, groupNettyClient.getProjectId());
             response.setRemark("已经收到消息");
             channelHandlerContext.write(response.toString());
         }
@@ -208,11 +206,11 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
 
     @Override
     public void channelUnregistered(final ChannelHandlerContext ctx) throws Exception {
-        log.info("Sleeping for: " + RECONNECT_DELAY + "s,Reconnecting to: " + groupNettyClient.host + ':' + groupNettyClient.port);
+        log.info("Sleeping for: " + RECONNECT_DELAY + "s,Reconnecting to: " + groupNettyClient.getHost() + ':' + groupNettyClient.getPort());
         ctx.channel().eventLoop().schedule(new Runnable() {
             @Override
             public void run() {
-                log.info("Reconnecting to: " + groupNettyClient.host + ':' + groupNettyClient.port);
+                log.info("Reconnecting to: " + groupNettyClient.getHost() + ':' + groupNettyClient.getPort());
                 groupNettyClient.connect(groupNettyClient, ctx.channel());
             }
         }, RECONNECT_DELAY, TimeUnit.SECONDS);

+ 26 - 35
src/main/java/com/persagy/client/WebSocketClientFactory.java

@@ -7,23 +7,18 @@ import com.persagy.service.AlarmHandleService;
 import com.persagy.utils.GZIPCompressUtil;
 import com.persagy.utils.LockUtil;
 import com.persagy.utils.StringUtil;
-import io.netty.util.concurrent.RejectedExecutionHandlers;
-import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.java_websocket.WebSocket;
 import org.java_websocket.client.WebSocketClient;
 import org.java_websocket.handshake.ServerHandshake;
-import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -32,8 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  * @author:LuoGuangyi
  * @company:PersagyTechnologyCo.,Ltd
  * @since:2020/10/20 00209:23
- * @version:V1.0
- * 参考链接:https://blog.csdn.net/qq_35206261/article/details/103761773
+ * @version:V1.0 参考链接:https://blog.csdn.net/qq_35206261/article/details/103761773
  * 使用说明:
  * #1.发送消息
  * String msg = "";
@@ -45,37 +39,40 @@ import java.util.concurrent.atomic.AtomicInteger;
 @Component
 @Slf4j
 public class WebSocketClientFactory {
+    ExecutorService executor = ExecutorBuilder.create()
+            .setCorePoolSize(5)
+            .setMaxPoolSize(10)
+            .setWorkQueue(new LinkedBlockingQueue<>(102400))
+            .setHandler(new ThreadPoolExecutor.AbortPolicy())
+            .build();
+    @Autowired
+    AlarmHandleService alarmHandleService;
+    AtomicInteger total = new AtomicInteger(0);
     /**
      * IP
      */
     @Value("${terminal.alarm.host:127.0.0.1}")
-    public String host;
+    private String host;
     /**
      * 端口
      */
     @Value("${terminal.alarm.port}")
-    public int port;
+    private int port;
     /**
      * 后缀
      */
     @Value("${terminal.alarm.suffix}")
-    String suffix;
+    private String suffix;
     /**
      * 是否启用压缩
      */
     @Value("${terminal.alarm.compress}")
-    boolean compress;
+    private boolean compress;
     /**
      * 项目名称
      */
     @Value("${project.iotid}")
-    String iotProjectId;
-    ExecutorService executor = ExecutorBuilder.create()
-            .setCorePoolSize(5)
-            .setMaxPoolSize(10)
-            .setWorkQueue(new LinkedBlockingQueue<>(102400))
-            .setHandler(new ThreadPoolExecutor.AbortPolicy())
-            .build();
+    private String iotProjectId;
     private WebSocketClient outCallWebSocketClientHolder;
 
     public WebSocketClient getOutCallWebSocketClientHolder() {
@@ -86,12 +83,6 @@ public class WebSocketClientFactory {
         this.outCallWebSocketClientHolder = outCallWebSocketClientHolder;
     }
 
-    @Autowired
-    AlarmHandleService alarmHandleService;
-
-
-    AtomicInteger total = new AtomicInteger(0);
-
     /**
      * 创建websocket对象
      *
@@ -99,9 +90,9 @@ public class WebSocketClientFactory {
      * @throws URISyntaxException
      */
     private WebSocketClient createNewWebSocketClient() throws URISyntaxException {
-        String outCallWebSockertUrl = "ws://"+host+":"+port;
-        outCallWebSockertUrl+=StringUtil.isEmpty(suffix)?"":"/"+suffix;
-        log.info("连接地址为:[{}]",outCallWebSockertUrl);
+        String outCallWebSockertUrl = "ws://" + host + ":" + port;
+        outCallWebSockertUrl += StringUtil.isEmpty(suffix) ? "" : "/" + suffix;
+        log.info("连接地址为:[{}]", outCallWebSockertUrl);
         WebSocketClient webSocketClient = new WebSocketClient(new URI(outCallWebSockertUrl)) {
             @Override
             public void onOpen(ServerHandshake serverHandshake) {
@@ -122,7 +113,7 @@ public class WebSocketClientFactory {
                 }
                 log.info("接收信息为:{}", message);
                 try {
-                    while (!LockUtil.getInstance().isExecute()){
+                    while (!LockUtil.getInstance().isExecute()) {
                         try {
                             log.warn("等待获取锁....");
                             LockUtil.getInstance().lock.lockInterruptibly();
@@ -133,14 +124,14 @@ public class WebSocketClientFactory {
 //                                e.printStackTrace();
 //                            }
 //                            log.warn("等待结束....");
-                        }catch (Exception e) {
+                        } catch (Exception e) {
                             log.error("数据加锁处理发生异常", e);
-                        }finally {
+                        } finally {
                             LockUtil.getInstance().lock.unlock();
                         }
                     }
                     String finalMessage = message;
-                    executor.execute(()-> {
+                    executor.execute(() -> {
                         try {
                             alarmHandleService.handleIOTData(finalMessage);
                         } catch (Exception e) {
@@ -157,13 +148,13 @@ public class WebSocketClientFactory {
             @Override
             public void onClose(int code, String reason, boolean remote) {
                 //code, reason, remote
-                log.warn("关闭连接,code[{}],reson[{}],remote[{}]",code,reason,remote);
+                log.warn("关闭连接,code[{}],reson[{}],remote[{}]", code, reason, remote);
                 //retryOutCallWebSocketClient();
             }
 
             @Override
             public void onError(Exception e) {
-                log.error("连接异常",e);
+                log.error("连接异常", e);
                 //retryOutCallWebSocketClient();
             }
         };
@@ -194,7 +185,7 @@ public class WebSocketClientFactory {
             this.setOutCallWebSocketClientHolder(webSocketClient);
             return webSocketClient;
         } catch (URISyntaxException e) {
-            log.error("retryOutCallWebSocketClient失败:",e);
+            log.error("retryOutCallWebSocketClient失败:", e);
         }
         return null;
     }
@@ -231,7 +222,7 @@ public class WebSocketClientFactory {
      * @since: 2020/10/20 9:54
      * @version: V1.0
      */
-    @Scheduled(initialDelay = 20000, fixedDelay = 10000)
+//    @Scheduled(initialDelay = 20000, fixedDelay = 10000)
     public void holderConneted() {
         log.debug("连接状态监测中....");
         try {

+ 68 - 69
src/main/java/com/persagy/config/QuartzConfiguration.java

@@ -26,79 +26,78 @@ import java.util.Properties;
 @Configuration
 @EnableScheduling
 public class QuartzConfiguration {
-	/**
-	 * 继承org.springframework.scheduling.quartz.SpringBeanJobFactory 实现任务实例化方式
-	 */
-	public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
+    /**
+     * 配置任务工厂实例
+     *
+     * @param applicationContext spring上下文实例
+     * @return
+     */
+    @Bean
+    public JobFactory jobFactory(ApplicationContext applicationContext) {
+        /**
+         * 采用自定义任务工厂 整合spring实例来完成构建任务 see {@link AutowiringSpringBeanJobFactory}
+         */
+        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
+        jobFactory.setApplicationContext(applicationContext);
+        return jobFactory;
+    }
 
-		private transient AutowireCapableBeanFactory beanFactory;
+    // @Qualifier("dataSource0")
+    @Bean(name = "quartzScheduler")
+    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory,
+                                                     Properties quartzProperties) throws IOException {
+        SchedulerFactoryBean factory = new SchedulerFactoryBean();
+        // 将spring管理job自定义工厂交由调度器维护
+        factory.setJobFactory(jobFactory);
+        factory.setSchedulerName("quartzScheduler");
+        factory.setDataSource(dataSource);
+        // 设置覆盖已存在的任务
+        factory.setOverwriteExistingJobs(true);
+        // 项目启动完成后,等待2秒后开始执行调度器初始化
+        factory.setStartupDelay(20);
+        // 设置调度器自动运行
+        factory.setAutoStartup(true);
+        // factory.setConfigLocation(new ClassPathResource("/quartz.properties"));
+        factory.setQuartzProperties(quartzProperties);
+        return factory;
+    }
 
-		@Override
-		public void setApplicationContext(final ApplicationContext context) {
-			beanFactory = context.getAutowireCapableBeanFactory();
-		}
+    @Bean
+    public Properties quartzProperties() throws IOException {
+        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
+        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
+        // 在quartz.properties中的属性被读取并注入后再初始化对象
+        propertiesFactoryBean.afterPropertiesSet();
+        return propertiesFactoryBean.getObject();
+    }
 
-		/**
-		 * 将job实例交给spring ioc托管 我们在job实例实现类内可以直接使用spring注入的调用被spring ioc管理的实例
-		 * 
-		 * @param bundle
-		 * @return
-		 * @throws Exception
-		 */
-		@Override
-		protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
-			final Object job = super.createJobInstance(bundle);
-			/**
-			 * 将job实例交付给spring ioc
-			 */
-			beanFactory.autowireBean(job);
-			return job;
-		}
-	}
+    /**
+     * 继承org.springframework.scheduling.quartz.SpringBeanJobFactory 实现任务实例化方式
+     */
+    public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
 
-	/**
-	 * 配置任务工厂实例
-	 * 
-	 * @param applicationContext
-	 *            spring上下文实例
-	 * @return
-	 */
-	@Bean
-	public JobFactory jobFactory(ApplicationContext applicationContext) {
-		/**
-		 * 采用自定义任务工厂 整合spring实例来完成构建任务 see {@link AutowiringSpringBeanJobFactory}
-		 */
-		AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
-		jobFactory.setApplicationContext(applicationContext);
-		return jobFactory;
-	}
+        private transient AutowireCapableBeanFactory beanFactory;
 
-	// @Qualifier("dataSource0")
-	@Bean(name = "quartzScheduler")
-	public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory,
-			Properties quartzProperties) throws IOException {
-		SchedulerFactoryBean factory = new SchedulerFactoryBean();
-		// 将spring管理job自定义工厂交由调度器维护
-		factory.setJobFactory(jobFactory);
-		factory.setSchedulerName("quartzScheduler");
-		factory.setDataSource(dataSource);
-		// 设置覆盖已存在的任务
-		factory.setOverwriteExistingJobs(true);
-		// 项目启动完成后,等待2秒后开始执行调度器初始化
-		factory.setStartupDelay(20);
-		// 设置调度器自动运行
-		factory.setAutoStartup(true);
-		// factory.setConfigLocation(new ClassPathResource("/quartz.properties"));
-		factory.setQuartzProperties(quartzProperties);
-		return factory;
-	}
+        @Override
+        public void setApplicationContext(final ApplicationContext context) {
+            beanFactory = context.getAutowireCapableBeanFactory();
+        }
 
-	@Bean
-	public Properties quartzProperties() throws IOException {
-		PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
-		propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
-		// 在quartz.properties中的属性被读取并注入后再初始化对象
-		propertiesFactoryBean.afterPropertiesSet();
-		return propertiesFactoryBean.getObject();
-	}
+        /**
+         * 将job实例交给spring ioc托管 我们在job实例实现类内可以直接使用spring注入的调用被spring ioc管理的实例
+         *
+         * @param bundle
+         * @return
+         * @throws Exception
+         */
+        @Override
+        protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
+            final Object job = super.createJobInstance(bundle);
+            /**
+             * 将job实例交付给spring ioc
+             */
+            beanFactory.autowireBean(job);
+            return job;
+        }
+    }
 }

+ 82 - 77
src/main/java/com/persagy/controller/HelloWorld.java

@@ -28,89 +28,94 @@ import java.util.concurrent.atomic.AtomicInteger;
 @RequestMapping("hello")
 @Slf4j
 public class HelloWorld {
-	@Autowired
-	AlarmHandleService alarmHandleService;
+    @Autowired
+    AlarmHandleService alarmHandleService;
+    @Autowired
+    AlarmInfoCache alarmInfoCache;
+    @Autowired
+    AlarmRecordRepository alarmRecordRepository;
+    @Autowired
+    private GroupNettyClient groupNettyClient;
 
-	@Autowired
-	private GroupNettyClient groupNettyClient;
-	@Autowired
-	AlarmInfoCache alarmInfoCache;
-	@Autowired
-	AlarmRecordRepository alarmRecordRepository;
-	@PostMapping("/")
-	public String world(@RequestBody JSONObject jsonObject) throws Exception {
-		return "hello world!";
-	}
-	@PostMapping("/testMesage")
-	public String testMesage(@RequestBody JSONObject jsonObject) throws Exception {
-		NettyMessage nettyMessage = new NettyMessage(groupNettyClient.projectId);
-		nettyMessage.setRemark("连接已经建立;");
-		nettyMessage.setOpCode(4);
-		JSONObject content = new JSONObject();
-		content.put("groupCode", groupNettyClient.groupCode);
-		content.put("projectId", groupNettyClient.projectId);
-		nettyMessage.setContent(Arrays.asList(content));
-		groupNettyClient.sendMessage(nettyMessage.toString());
-		return "成功";
-	}
+    public GroupNettyClient getGroupNettyClient() {
+        return groupNettyClient;
+    }
 
-	@PostMapping("/test")
-	public String test(@RequestBody JSONObject jsonObject) throws Exception {
-		LockUtil.getInstance().lock.lock();
-		try {
-			LockUtil.getInstance().setExecute(!LockUtil.getInstance().isExecute());
-			//加个等待,保证正在执行的逻辑执行成功
-			Thread.sleep(2000);
-			if(LockUtil.getInstance().isExecute()){
-				LockUtil.getInstance().condition.signalAll();
-			}
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		} finally {
-			LockUtil.getInstance().lock.unlock();
-		}
-		AtomicInteger atomicInteger = new AtomicInteger(0);
-		alarmInfoCache.getAlarmDefineMap().entrySet().forEach(entry->{
+    @PostMapping("/")
+    public String world(@RequestBody JSONObject jsonObject) throws Exception {
+        return "hello world!";
+    }
+
+    @PostMapping("/testMesage")
+    public String testMesage(@RequestBody JSONObject jsonObject) throws Exception {
+        NettyMessage nettyMessage = new NettyMessage(4, groupNettyClient.getProjectId());
+        nettyMessage.setRemark("连接已经建立;");
+        JSONObject content = new JSONObject();
+        content.put("groupCode", groupNettyClient.getGroupCode());
+        content.put("projectId", groupNettyClient.getProjectId());
+        nettyMessage.setContent(Arrays.asList(content));
+        groupNettyClient.sendMessage(nettyMessage.toString());
+        return "成功";
+    }
+
+
+    @PostMapping("/test")
+    public String test(@RequestBody JSONObject jsonObject) throws Exception {
+        LockUtil.getInstance().lock.lock();
+        try {
+            LockUtil.getInstance().setExecute(!LockUtil.getInstance().isExecute());
+            //加个等待,保证正在执行的逻辑执行成功
+            Thread.sleep(2000);
+            if (LockUtil.getInstance().isExecute()) {
+                LockUtil.getInstance().condition.signalAll();
+            }
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        } finally {
+            LockUtil.getInstance().lock.unlock();
+        }
+        AtomicInteger atomicInteger = new AtomicInteger(0);
+        alarmInfoCache.getAlarmDefineMap().entrySet().forEach(entry -> {
 //			log.info("[{}]的key:[{}],value:[{}]",atomicInteger.getAndIncrement(),entry.getKey(),entry.getValue());
-		});
-		return "成功";
-	}
+        });
+        return "成功";
+    }
 
-	@PostMapping("/test2")
-	public String test2(@RequestBody JSONObject jsonObject) throws Exception {
-		String message = jsonObject.getString("message");
-		alarmHandleService.handleIOTData(message);
-		return "成功";
-	}
+    @PostMapping("/test2")
+    public String test2(@RequestBody JSONObject jsonObject) throws Exception {
+        String message = jsonObject.getString("message");
+        alarmHandleService.handleIOTData(message);
+        return "成功";
+    }
 
-	@PostMapping("/test3")
-	public ArrayList<ZktAlarmRecordDO> test3(@RequestBody JSONObject jsonObject) throws Exception {
-		String defineId = jsonObject.getString("itemCode") + "-" + jsonObject.getString("objId") + "-" + jsonObject.getString("targetId");
-		ZktAlarmRecordDO zktAlarmRecordDO = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO());
-		zktAlarmRecordDO.setDefinitionId(defineId);
-		zktAlarmRecordDO.setItemCode(jsonObject.getString("itemCode"));
-		zktAlarmRecordDO.setObjId(jsonObject.getString("objId"));
-		zktAlarmRecordDO.setTargetId(jsonObject.getString("targetId"));
-		zktAlarmRecordDO.setAlarmId(jsonObject.getString("id"));
-		ZktAlarmRecordDO save = alarmRecordRepository.save(zktAlarmRecordDO);
-		log.info("保存结果为:{}",save);
-		Iterable<ZktAlarmRecordDO> all = alarmRecordRepository.findAll();
-		Iterator<ZktAlarmRecordDO> iterator = all.iterator();
-		ArrayList<ZktAlarmRecordDO> list = new ArrayList<>();
-		while (iterator.hasNext()) {
-			list.add(iterator.next());
-		}
-		return list;
-	}
+    @PostMapping("/test3")
+    public ArrayList<ZktAlarmRecordDO> test3(@RequestBody JSONObject jsonObject) throws Exception {
+        String defineId = jsonObject.getString("itemCode") + "-" + jsonObject.getString("objId") + "-" + jsonObject.getString("targetId");
+        ZktAlarmRecordDO zktAlarmRecordDO = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO());
+        zktAlarmRecordDO.setDefinitionId(defineId);
+        zktAlarmRecordDO.setItemCode(jsonObject.getString("itemCode"));
+        zktAlarmRecordDO.setObjId(jsonObject.getString("objId"));
+        zktAlarmRecordDO.setTargetId(jsonObject.getString("targetId"));
+        zktAlarmRecordDO.setAlarmId(jsonObject.getString("id"));
+        ZktAlarmRecordDO save = alarmRecordRepository.save(zktAlarmRecordDO);
+        log.info("保存结果为:{}", save);
+        Iterable<ZktAlarmRecordDO> all = alarmRecordRepository.findAll();
+        Iterator<ZktAlarmRecordDO> iterator = all.iterator();
+        ArrayList<ZktAlarmRecordDO> list = new ArrayList<>();
+        while (iterator.hasNext()) {
+            list.add(iterator.next());
+        }
+        return list;
+    }
 
-	@PostMapping("/test4")
-	public Map<String, AlarmDefine> test4(@RequestBody JSONObject jsonObject) throws Exception {
-		ConcurrentHashMap<String, AlarmDefine> alarmDefineMap = alarmInfoCache.getAlarmDefineMap();
-		if(ObjectUtil.isNotEmpty(alarmDefineMap)){
-			return alarmDefineMap;
-		}
-		return new HashMap<>();
-	}
+    @PostMapping("/test4")
+    public Map<String, AlarmDefine> test4(@RequestBody JSONObject jsonObject) throws Exception {
+        ConcurrentHashMap<String, AlarmDefine> alarmDefineMap = alarmInfoCache.getAlarmDefineMap();
+        if (ObjectUtil.isNotEmpty(alarmDefineMap)) {
+            return alarmDefineMap;
+        }
+        return new HashMap<>();
+    }
 
 }
 

+ 23 - 20
src/main/java/com/persagy/demo/netty/websocket/client/WebSocketClient.java

@@ -26,7 +26,10 @@ import io.netty.channel.socket.nio.NioSocketChannel;
 import io.netty.handler.codec.http.DefaultHttpHeaders;
 import io.netty.handler.codec.http.HttpClientCodec;
 import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.websocketx.*;
+import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
+import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory;
+import io.netty.handler.codec.http.websocketx.WebSocketFrame;
+import io.netty.handler.codec.http.websocketx.WebSocketVersion;
 import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler;
 import io.netty.handler.ssl.SslContext;
 import io.netty.handler.ssl.SslContextBuilder;
@@ -54,13 +57,13 @@ import java.net.URI;
  */
 public final class WebSocketClient implements org.springframework.web.socket.client.WebSocketClient {
 
-//    static final String URL = System.getProperty("url", "ws://127.0.0.1:9981/websocket");
+    //    static final String URL = System.getProperty("url", "ws://127.0.0.1:9981/websocket");
     static final String URL = System.getProperty("url", "ws://121.40.165.18:8800");
 
     public static void main(String[] args) throws Exception {
         URI uri = new URI(URL);
-        String scheme = uri.getScheme() == null? "ws" : uri.getScheme();
-        final String host = uri.getHost() == null? "127.0.0.1" : uri.getHost();
+        String scheme = uri.getScheme() == null ? "ws" : uri.getScheme();
+        final String host = uri.getHost() == null ? "127.0.0.1" : uri.getHost();
         final int port;
         if (uri.getPort() == -1) {
             if ("ws".equalsIgnoreCase(scheme)) {
@@ -83,7 +86,7 @@ public final class WebSocketClient implements org.springframework.web.socket.cli
         final SslContext sslCtx;
         if (ssl) {
             sslCtx = SslContextBuilder.forClient()
-                .trustManager(InsecureTrustManagerFactory.INSTANCE).build();
+                    .trustManager(InsecureTrustManagerFactory.INSTANCE).build();
         } else {
             sslCtx = null;
         }
@@ -101,21 +104,21 @@ public final class WebSocketClient implements org.springframework.web.socket.cli
 
             Bootstrap b = new Bootstrap();
             b.group(group)
-             .channel(NioSocketChannel.class)
-             .handler(new ChannelInitializer<SocketChannel>() {
-                 @Override
-                 protected void initChannel(SocketChannel ch) {
-                     ChannelPipeline p = ch.pipeline();
-                     if (sslCtx != null) {
-                         p.addLast(sslCtx.newHandler(ch.alloc(), host, port));
-                     }
-                     p.addLast(
-                             new HttpClientCodec(),
-                             new HttpObjectAggregator(8192),
-                             WebSocketClientCompressionHandler.INSTANCE,
-                             handler);
-                 }
-             });
+                    .channel(NioSocketChannel.class)
+                    .handler(new ChannelInitializer<SocketChannel>() {
+                        @Override
+                        protected void initChannel(SocketChannel ch) {
+                            ChannelPipeline p = ch.pipeline();
+                            if (sslCtx != null) {
+                                p.addLast(sslCtx.newHandler(ch.alloc(), host, port));
+                            }
+                            p.addLast(
+                                    new HttpClientCodec(),
+                                    new HttpObjectAggregator(8192),
+                                    WebSocketClientCompressionHandler.INSTANCE,
+                                    handler);
+                        }
+                    });
 
             Channel ch = b.connect(uri.getHost(), port).sync().channel();
             handler.handshakeFuture().sync();

+ 1 - 2
src/main/java/com/persagy/demo/netty/websocket/client/WebSocketClientHandler.java

@@ -37,7 +37,6 @@
 
 package com.persagy.demo.netty.websocket.client;
 
-import io.netty.buffer.ByteBuf;
 import io.netty.channel.*;
 import io.netty.handler.codec.http.FullHttpResponse;
 import io.netty.handler.codec.http.websocketx.*;
@@ -109,7 +108,7 @@ public class WebSocketClientHandler extends SimpleChannelInboundHandler<Object>
                 System.out.println("WebSocket Client connected!");
                 handshakeFuture.setSuccess();
             } catch (WebSocketHandshakeException e) {
-                log.error("WebSocket Client failed to connect",e);
+                log.error("WebSocket Client failed to connect", e);
                 handshakeFuture.setFailure(e);
             }
             return;

+ 3 - 2
src/main/java/com/persagy/demo/netty/websocket/server/MyChannelHandlerPool.java

@@ -10,8 +10,9 @@ import io.netty.util.concurrent.GlobalEventExecutor;
  */
 public class MyChannelHandlerPool {
 
-    public MyChannelHandlerPool(){}
-
     public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
 
+    public MyChannelHandlerPool() {
+    }
+
 }

+ 29 - 29
src/main/java/com/persagy/demo/netty/websocket/server/MyWebSocketHandler.java

@@ -15,6 +15,26 @@ import java.util.Map;
  */
 public class MyWebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
 
+    private static Map getUrlParams(String url) {
+        Map<String, String> map = new HashMap<>();
+        url = url.replace("?", ";");
+        if (!url.contains(";")) {
+            return map;
+        }
+        if (url.split(";").length > 0) {
+            String[] arr = url.split(";")[1].split("&");
+            for (String s : arr) {
+                String key = s.split("=")[0];
+                String value = s.split("=")[1];
+                map.put(key, value);
+            }
+            return map;
+
+        } else {
+            return map;
+        }
+    }
+
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
         System.out.println("与客户端建立连接,通道开启!");
@@ -37,19 +57,19 @@ public class MyWebSocketHandler extends SimpleChannelInboundHandler<TextWebSocke
             FullHttpRequest request = (FullHttpRequest) msg;
             String uri = request.uri();
 
-            Map paramMap=getUrlParams(uri);
-            System.out.println("接收到的参数是:"+JSON.toJSONString(paramMap));
+            Map paramMap = getUrlParams(uri);
+            System.out.println("接收到的参数是:" + JSON.toJSONString(paramMap));
             //如果url包含参数,需要处理
-            if(uri.contains("?")){
-                String newUri=uri.substring(0,uri.indexOf("?"));
+            if (uri.contains("?")) {
+                String newUri = uri.substring(0, uri.indexOf("?"));
                 System.out.println(newUri);
                 request.setUri(newUri);
             }
 
-        }else if(msg instanceof TextWebSocketFrame){
+        } else if (msg instanceof TextWebSocketFrame) {
             //正常的TEXT消息类型
-            TextWebSocketFrame frame=(TextWebSocketFrame)msg;
-            System.out.println("客户端收到服务器数据:" +frame.text());
+            TextWebSocketFrame frame = (TextWebSocketFrame) msg;
+            System.out.println("客户端收到服务器数据:" + frame.text());
             sendAllMessage(frame.text());
         }
         super.channelRead(ctx, msg);
@@ -60,28 +80,8 @@ public class MyWebSocketHandler extends SimpleChannelInboundHandler<TextWebSocke
 
     }
 
-    private void sendAllMessage(String message){
+    private void sendAllMessage(String message) {
         //收到信息后,群发给所有channel
-        MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
-    }
-
-    private static Map getUrlParams(String url){
-        Map<String,String> map = new HashMap<>();
-        url = url.replace("?",";");
-        if (!url.contains(";")){
-            return map;
-        }
-        if (url.split(";").length > 0){
-            String[] arr = url.split(";")[1].split("&");
-            for (String s : arr){
-                String key = s.split("=")[0];
-                String value = s.split("=")[1];
-                map.put(key,value);
-            }
-            return  map;
-
-        }else{
-            return map;
-        }
+        MyChannelHandlerPool.channelGroup.writeAndFlush(new TextWebSocketFrame(message));
     }
 }

+ 29 - 33
src/main/java/com/persagy/entity/AlarmDefine.java

@@ -4,38 +4,36 @@ import com.alibaba.fastjson.JSONObject;
 import lombok.Data;
 
 /**
-*@description:
-*@author:LuoGuangyi
-*@company:PersagyTechnologyCo.,Ltd
-*@since:2020/10/18 001814:37
-*@version:V1.0
- *{
- *     "streamId": "",
- *     "opCode": "",
- *     "content": [
- *        {
- *             "id": "000f9609-685e-47b7-bb7d-e91d31f21f8d",
- *             "objId": "Eq1101050029e8fa1f6e4c81483fbfd7c554e1cdcd2e",
- *             "projectId": "Pj1101050029",
- *             "itemCode": "1051",
- *             "category": "Eq",
- *             "level": "S",
- *             "remark": "更改报警等级333",
- *             "condition": {
- *             },
- *             "open": 0,
- *             "concern": 0,
- *             "userDefined": 0,
- *             "createUser": "System",
- *             "createTime": 1603268498000,
- *             "updateUser": "systemId",
- *             "updateTime": 1603372305000,
- *             "valid": 1
- *         }
- *     ]
+ * @description:
+ * @author:LuoGuangyi
+ * @company:PersagyTechnologyCo.,Ltd
+ * @since:2020/10/18 001814:37
+ * @version:V1.0 {
+ * "streamId": "",
+ * "opCode": "",
+ * "content": [
+ * {
+ * "id": "000f9609-685e-47b7-bb7d-e91d31f21f8d",
+ * "objId": "Eq1101050029e8fa1f6e4c81483fbfd7c554e1cdcd2e",
+ * "projectId": "Pj1101050029",
+ * "itemCode": "1051",
+ * "category": "Eq",
+ * "level": "S",
+ * "remark": "更改报警等级333",
+ * "condition": {
+ * },
+ * "open": 0,
+ * "concern": 0,
+ * "userDefined": 0,
+ * "createUser": "System",
+ * "createTime": 1603268498000,
+ * "updateUser": "systemId",
+ * "updateTime": 1603372305000,
+ * "valid": 1
  * }
- *
-**/
+ * ]
+ * }
+ **/
 @Data
 public class AlarmDefine {
     /**
@@ -93,8 +91,6 @@ public class AlarmDefine {
     private int concern;
 
 
-
-
     @Override
     public String toString() {
         return JSONObject.toJSONString(this);

+ 0 - 9
src/main/java/com/persagy/entity/AlarmRecord.java

@@ -9,7 +9,6 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.Column;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -140,14 +139,6 @@ public class AlarmRecord implements Serializable {
     private Date endTime;
 
 
-
-
-
-
-
-
-
-
     /**
      * 创建用户
      */

+ 20 - 18
src/main/java/com/persagy/entity/AlarmState.java

@@ -49,6 +49,7 @@ public class AlarmState {
     /**
      * 重置除了实时数据正常状态外的数据为默认值
      * (不报警,不过期,报警开始时间和结束时间为空)
+     *
      * @return
      */
     public String reset() {
@@ -72,6 +73,15 @@ public class AlarmState {
             this.name = name;
         }
 
+        public static Overdue getEnumByType(Integer type) {
+            for (Overdue status : Overdue.values()) {
+                if (status.getType().equals(type)) {
+                    return status;
+                }
+            }
+            return null;
+        }
+
         public String getType() {
             return type;
         }
@@ -87,16 +97,8 @@ public class AlarmState {
         public void setName(String name) {
             this.name = name;
         }
-
-        public static Overdue getEnumByType(Integer type) {
-            for (Overdue status : Overdue.values()) {
-                if (status.getType().equals(type)) {
-                    return status;
-                }
-            }
-            return null;
-        }
     }
+
     public enum State {
 
         NORMAL("0", "正常、已恢复"),
@@ -110,6 +112,15 @@ public class AlarmState {
             this.name = name;
         }
 
+        public static Overdue getEnumByType(Integer type) {
+            for (Overdue status : Overdue.values()) {
+                if (status.getType().equals(type)) {
+                    return status;
+                }
+            }
+            return null;
+        }
+
         public String getType() {
             return type;
         }
@@ -125,14 +136,5 @@ public class AlarmState {
         public void setName(String name) {
             this.name = name;
         }
-
-        public static Overdue getEnumByType(Integer type) {
-            for (Overdue status : Overdue.values()) {
-                if (status.getType().equals(type)) {
-                    return status;
-                }
-            }
-            return null;
-        }
     }
 }

+ 30 - 30
src/main/java/com/persagy/entity/Condition.java

@@ -10,37 +10,36 @@ import java.util.List;
  * @author:LuoGuangyi
  * @company:PersagyTechnologyCo.,Ltd
  * @since:2020/10/20 002018:20
- * @version:V1.0
- * 实例:
+ * @version:V1.0 实例:
  * {
- *                 "infoCode": [
- *                     "infoCode1",
- *                     "infoCode1"
- *                 ],
- *                 "infoCodes": [
- *                     {
- *                         "infoCode": "infoCode1",
- *                         "meterId": "11",
- *                         "funcId": "12"
- *                     },
- *                     {
- *                         "infoCode": "infoCode2",
- *                         "meterId": "21",
- *                         "funcId": "22"
- *                     }
- *                 ],
- *                 "trigger": "(infoCode1 > 10 && infoCode1 < 20) && (infoCode2 < 20)",
- *                 "end": "!(infoCode1 < 20 && infoCode1 > 10)",
- *                 "$triggerUphold": 10,
- *                 "$endUphold": 5,
- *                 "$time": {
- *                     "type": "period",
- *                     "period": {
- *                         "$gt": "090000",
- *                         "$lt": "210000"
- *                     }
- *                 }
- *             }
+ * "infoCode": [
+ * "infoCode1",
+ * "infoCode1"
+ * ],
+ * "infoCodes": [
+ * {
+ * "infoCode": "infoCode1",
+ * "meterId": "11",
+ * "funcId": "12"
+ * },
+ * {
+ * "infoCode": "infoCode2",
+ * "meterId": "21",
+ * "funcId": "22"
+ * }
+ * ],
+ * "trigger": "(infoCode1 > 10 && infoCode1 < 20) && (infoCode2 < 20)",
+ * "end": "!(infoCode1 < 20 && infoCode1 > 10)",
+ * "$triggerUphold": 10,
+ * "$endUphold": 5,
+ * "$time": {
+ * "type": "period",
+ * "period": {
+ * "$gt": "090000",
+ * "$lt": "210000"
+ * }
+ * }
+ * }
  **/
 @Data
 public class Condition {
@@ -52,6 +51,7 @@ public class Condition {
     private int triggerUphold;
     private int endUphold;
     private JSONObject effectTime;
+
     @Override
     public String toString() {
         return JSONObject.toJSONString(this);

+ 1 - 0
src/main/java/com/persagy/entity/ExpireAlarmMessage.java

@@ -35,6 +35,7 @@ public class ExpireAlarmMessage {
      * 定时任务数据
      */
     JobDataMap jobDataMap;
+
     @Override
     public String toString() {
         return JSONObject.toJSONString(this);

+ 9 - 15
src/main/java/com/persagy/entity/NettyMessage.java

@@ -3,9 +3,7 @@ package com.persagy.entity;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.annotation.JSONField;
 import lombok.Data;
-import lombok.Getter;
 import lombok.NoArgsConstructor;
-import lombok.Setter;
 
 import java.util.List;
 
@@ -33,15 +31,15 @@ public class NettyMessage<T> {
     @JSONField()
     private int opCode;
     /**
-    请求来源
+     * 请求来源
      */
     @JSONField()
     private String source = "project";
 
     /**
-    传输内容
+     * 传输内容
      */
-    @JSONField(jsonDirect=true)
+    @JSONField(jsonDirect = true)
     private List<T> content;
     /**
      * 备注说明
@@ -50,11 +48,16 @@ public class NettyMessage<T> {
     private String remark;
 
     /**
-    成功标识
+     * 成功标识
      */
     @JSONField()
     private Boolean success;
 
+    public NettyMessage(int opCode, String source) {
+        this.opCode = opCode;
+        this.source = source;
+    }
+
     public List<T> getContent() {
         return content;
     }
@@ -63,15 +66,6 @@ public class NettyMessage<T> {
         this.content = content;
     }
 
-    public NettyMessage(int opCode, String source) {
-        this.opCode = opCode;
-        this.source = source;
-    }
-
-    public NettyMessage(String source) {
-        this.source = source;
-    }
-
     @Override
     public String toString() {
         return JSONObject.toJSONString(this);

+ 4 - 1
src/main/java/com/persagy/entity/ZktAlarmRecordDO.java

@@ -10,7 +10,10 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import java.io.Serializable;
 import java.util.Date;
 

+ 17 - 18
src/main/java/com/persagy/init/InitRunner.java

@@ -19,23 +19,22 @@ import org.springframework.stereotype.Service;
 @Slf4j
 public class InitRunner implements CommandLineRunner {
 
-	@Autowired
-	private WebSocketClientFactory webSocketClientFactory;
-	@Autowired
-	private GroupNettyClient groupNettyClient;
-	@Autowired
-	AlarmQuartzService alarmQuartzService;
+    @Autowired
+    AlarmQuartzService alarmQuartzService;
+    @Autowired
+    private WebSocketClientFactory webSocketClientFactory;
+    @Autowired
+    private GroupNettyClient groupNettyClient;
 
-
-	@Override
-	public void run(String... args) throws Exception {
-		//5.0 开始引入了 LRU 缓存,可指定缓存的表达式个数,比如设置为最大 1 万个缓存结果:
-		AviatorEvaluator.getInstance().useLRUExpressionCache(10000);
-		//启动netty客户端,接受云端数据
-		groupNettyClient.start();
-		//启动websocket,接受IOT采集庶数据
-		webSocketClientFactory.retryOutCallWebSocketClient();
-		//异步消费消息
-		ThreadUtil.execAsync(new AlarmMessageThread(alarmQuartzService),true);
-	}
+    @Override
+    public void run(String... args) throws Exception {
+        //5.0 开始引入了 LRU 缓存,可指定缓存的表达式个数,比如设置为最大 1 万个缓存结果:
+        AviatorEvaluator.getInstance().useLRUExpressionCache(10000);
+        //启动netty客户端,接受云端数据
+        groupNettyClient.start();
+        //启动websocket,接受IOT采集庶数据
+        webSocketClientFactory.retryOutCallWebSocketClient();
+        //异步消费消息
+        ThreadUtil.execAsync(new AlarmMessageThread(alarmQuartzService), true);
+    }
 }

+ 41 - 45
src/main/java/com/persagy/job/AlarmExpireJob.java

@@ -3,7 +3,6 @@ package com.persagy.job;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
-import com.alibaba.fastjson.JSONObject;
 import com.persagy.cache.AlarmInfoCache;
 import com.persagy.client.GroupNettyClient;
 import com.persagy.entity.AlarmRecord;
@@ -32,12 +31,22 @@ import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
 public class AlarmExpireJob extends QuartzJobBean {
 
     @Autowired
-    private GroupNettyClient groupNettyClient;
-    @Autowired
     AlarmRecordRepository alarmRecordRepository;
     @Autowired
     AlarmInfoCache alarmInfoCache;
     /**
+     * 集团编码
+     */
+    @Value("${group.code}")
+    private String groupCode;
+    /**
+     * 项目名称
+     */
+    @Value("${project.id}")
+    private String projectId;
+    @Autowired
+    private GroupNettyClient groupNettyClient;
+    /**
      * 报警记录信息详情
      */
     private String alarmRecord;
@@ -53,6 +62,19 @@ public class AlarmExpireJob extends QuartzJobBean {
      * 报警定义标识(itemcode+objId)
      */
     private String defineId;
+    /**
+     * 报警状态(2-恢复 3-过期)
+     */
+    private String state;
+    /**
+     * 恢复时间
+     */
+    private String endTime;
+    /**
+     * 恢复时刻信息
+     */
+    private String endInfo;
+    private AtomicLong nums = new AtomicLong(1L);
 
     public String getState() {
         return state;
@@ -62,11 +84,6 @@ public class AlarmExpireJob extends QuartzJobBean {
         this.state = state;
     }
 
-    /**
-     * 报警状态(2-恢复 3-过期)
-     */
-    private String state;
-
     public String getEndTime() {
         return endTime;
     }
@@ -83,47 +100,25 @@ public class AlarmExpireJob extends QuartzJobBean {
         this.endInfo = endInfo;
     }
 
-    /**
-     * 恢复时间
-     */
-    private String endTime;
-    /**
-     * 恢复时刻信息
-     */
-    private String endInfo;
-    /**
-     * 集团编码
-     */
-    @Value("${group.code}")
-    public String groupCode;
-
-    /**
-     * 项目名称
-     */
-    @Value("${project.id}")
-    String projectId;
-
-    private AtomicLong nums = new AtomicLong(1L);
-
     @Override
     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
         try {
             JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
-            log.info("----------------开始---------------------{}",alarmRecord);
-            log.warn("refireCount:[{}],过期/恢复时间:[{}/{}],实际执行时间:[{}]",context.getRefireCount(),StringUtil.getString(expireTime),StringUtil.getString(endTime),DateUtil.format(context.getFireTime(), DatePattern.ISO8601_PATTERN));
-            if(StringUtils.isNotBlank(alarmRecord)) {
+            log.info("----------------开始---------------------{}", alarmRecord);
+            log.warn("refireCount:[{}],过期/恢复时间:[{}/{}],实际执行时间:[{}]", context.getRefireCount(), StringUtil.getString(expireTime), StringUtil.getString(endTime), DateUtil.format(context.getFireTime(), DatePattern.ISO8601_PATTERN));
+            if (StringUtils.isNotBlank(alarmRecord)) {
                 ZktAlarmRecordDO zktAlarmRecordDO = StringUtil.tranferItemToDTO(alarmRecord, ZktAlarmRecordDO.class);
                 //立即过期,过期的时候可能还没有报警记录ID,需要重新执行下
                 String alarmId = alarmRecordRepository.findById(zktAlarmRecordDO.getDefinitionId()).orElse(new ZktAlarmRecordDO()).getAlarmId();
-                if(StringUtil.isEmpty(alarmId)) {
-                    log.info("refire:[{}]",refire);
-                    mergedJobDataMap.put("refire",String.valueOf(StringUtil.getInt(refire)+1));
-                    reFireJob(context,mergedJobDataMap);
+                if (StringUtil.isEmpty(alarmId)) {
+                    log.info("refire:[{}]", refire);
+                    mergedJobDataMap.put("refire", String.valueOf(StringUtil.getInt(refire) + 1));
+                    reFireJob(context, mergedJobDataMap);
                     log.info("----------------结束---------------------");
                     return;
                 }
-                log.info("报警参数为:[{}]",zktAlarmRecordDO.toString());
-                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6,projectId);
+                log.info("报警参数为:[{}]", zktAlarmRecordDO.toString());
+                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6, projectId);
                 nettyMessage.setStreamId(nums.getAndIncrement());
                 AlarmRecord message = AlarmRecord.builder()
                         .id(alarmId)
@@ -131,7 +126,7 @@ public class AlarmExpireJob extends QuartzJobBean {
                         .groupCode(groupCode)
                         .projectId(projectId)
                         .build();
-                if("2".equals(state)) {
+                if ("2".equals(state)) {
                     message.setEndInfo(endInfo);
                     message.setEndTime(DateUtils.parseDate(endTime));
                 }
@@ -141,13 +136,13 @@ public class AlarmExpireJob extends QuartzJobBean {
                 //已经过期的时候删除掉这条报警定义了,保证不会再次产生报警
                 AlarmState alarmState = new AlarmState(defineId);
                 alarmInfoCache.setAlarmState(defineId, alarmState);
-                if(alarmRecordRepository.existsById(zktAlarmRecordDO.getDefinitionId())){
+                if (alarmRecordRepository.existsById(zktAlarmRecordDO.getDefinitionId())) {
                     alarmRecordRepository.deleteById(zktAlarmRecordDO.getDefinitionId());
                 }
             }
             log.info("----------------结束---------------------");
         } catch (Exception e) {
-            log.error("job hander error",e);
+            log.error("job hander error", e);
         }
 
     }
@@ -155,9 +150,9 @@ public class AlarmExpireJob extends QuartzJobBean {
 
     private void reFireJob(JobExecutionContext context, JobDataMap mergedJobDataMap) {
         try {
-            if (StringUtil.getInt(refire)>1) {
-               log.error("重新执行依然失败,信息为:{}[{}]",state,alarmRecord);
-            }else {
+            if (StringUtil.getInt(refire) > 1) {
+                log.error("重新执行依然失败,信息为:{}[{}]", state, alarmRecord);
+            } else {
                 Scheduler scheduler = context.getScheduler();
                 Trigger trigger = context.getTrigger();
                 DateTime dateTime = DateUtil.offsetSecond(new Date(), 300);
@@ -172,6 +167,7 @@ public class AlarmExpireJob extends QuartzJobBean {
             log.error("获取不到报警记录ID.重新获取报错!", e);
         }
     }
+
     public String getAlarmRecord() {
         return alarmRecord;
     }

+ 8 - 8
src/main/java/com/persagy/job/AlarmMessageThread.java

@@ -12,7 +12,7 @@ import lombok.extern.slf4j.Slf4j;
  * @version:V1.0
  **/
 @Slf4j
-public class AlarmMessageThread implements Runnable{
+public class AlarmMessageThread implements Runnable {
 
     AlarmQuartzService alarmQuartzService;
 
@@ -26,17 +26,17 @@ public class AlarmMessageThread implements Runnable{
             System.out.println("--init--");
             //启动后先休息20秒,这样报警netty  websocket  quartz都启动了
             Thread.sleep(20000);
-            while (true){
+            while (true) {
                 ExpireAlarmMessage expireAlarmMessage = ExpireAlarmQueue.getExpireAlarmMessageQueue().consume();
-                log.info("剩余过期消息总数:{}",ExpireAlarmQueue.getExpireAlarmMessageQueue().size());
-                if("1".equals(expireAlarmMessage.getType())){
-                    alarmQuartzService.addExpireJob(expireAlarmMessage.getStartTime(),expireAlarmMessage.getJobName(),expireAlarmMessage.getJobGroupName(),expireAlarmMessage.getJobDataMap());
-                }else if("2".equals(expireAlarmMessage.getType())){
-                    alarmQuartzService.deleteExpireJob(expireAlarmMessage.getJobName(),expireAlarmMessage.getJobGroupName());
+                log.info("剩余过期消息总数:{}", ExpireAlarmQueue.getExpireAlarmMessageQueue().size());
+                if ("1".equals(expireAlarmMessage.getType())) {
+                    alarmQuartzService.addExpireJob(expireAlarmMessage.getStartTime(), expireAlarmMessage.getJobName(), expireAlarmMessage.getJobGroupName(), expireAlarmMessage.getJobDataMap());
+                } else if ("2".equals(expireAlarmMessage.getType())) {
+                    alarmQuartzService.deleteExpireJob(expireAlarmMessage.getJobName(), expireAlarmMessage.getJobGroupName());
                 }
             }
         } catch (Exception e) {
-            log.error("报警过期消息队列消费失败",e);
+            log.error("报警过期消息队列消费失败", e);
         }
     }
 

+ 23 - 16
src/main/java/com/persagy/job/ExpireAlarmQueue.java

@@ -6,8 +6,7 @@ import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
 /**
- * @description:报警过期,取消过期的消息队列,防止同步阻塞
- * 报警过期,取消过期涉及到定时任务的添加和删除,多线程操作会有并发异常,单线程操作当报警很多的时候会有性能问题
+ * @description:报警过期,取消过期的消息队列,防止同步阻塞 报警过期,取消过期涉及到定时任务的添加和删除,多线程操作会有并发异常,单线程操作当报警很多的时候会有性能问题
  * 增加缓冲队列
  * @author:LuoGuangyi
  * @company:PersagyTechnologyCo.,Ltd
@@ -16,38 +15,46 @@ import java.util.concurrent.LinkedBlockingQueue;
  **/
 public class ExpireAlarmQueue {
     //队列大小
-    static final int QUEUE_MAX_SIZE   = 20000;
+    static final int QUEUE_MAX_SIZE = 20000;
 
     static BlockingQueue<ExpireAlarmMessage> blockingQueue = new LinkedBlockingQueue<ExpireAlarmMessage>(QUEUE_MAX_SIZE);
 
     /**
      * 私有的默认构造子,保证外界无法直接实例化
      */
-    private ExpireAlarmQueue(){};
-    /**
-     * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
-     * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
-     */
-    private static class SingletonHolder{
-        /**
-         * 静态初始化器,由JVM来保证线程安全
-         */
-        private  static ExpireAlarmQueue queue = new ExpireAlarmQueue();
+    private ExpireAlarmQueue() {
     }
+
+    ;
+
     //单例队列
-    public static ExpireAlarmQueue getExpireAlarmMessageQueue(){
+    public static ExpireAlarmQueue getExpireAlarmMessageQueue() {
         return SingletonHolder.queue;
     }
+
     //生产入队
-    public  void  produce(ExpireAlarmMessage expireAlarmMessage) throws InterruptedException {
+    public void produce(ExpireAlarmMessage expireAlarmMessage) throws InterruptedException {
         blockingQueue.put(expireAlarmMessage);
     }
+
     //消费出队
-    public  ExpireAlarmMessage consume() throws InterruptedException {
+    public ExpireAlarmMessage consume() throws InterruptedException {
         return blockingQueue.take();
     }
+
     // 获取队列大小
     public int size() {
         return blockingQueue.size();
     }
+
+    /**
+     * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
+     * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
+     */
+    private static class SingletonHolder {
+        /**
+         * 静态初始化器,由JVM来保证线程安全
+         */
+        private static ExpireAlarmQueue queue = new ExpireAlarmQueue();
+    }
 }

+ 23 - 16
src/main/java/com/persagy/job/NettyMessageQueue.java

@@ -4,8 +4,7 @@ import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
 /**
- * @description:netty通信queue
- * 在云端与与边缘端断开连接后,报警消息,报警恢复消息,报警过期消息缓冲在边缘端的NettyMessageQueue队列中,
+ * @description:netty通信queue 在云端与与边缘端断开连接后,报警消息,报警恢复消息,报警过期消息缓冲在边缘端的NettyMessageQueue队列中,
  * 再次连接后,从队列发送到云端
  * @author:LuoGuangyi
  * @company:PersagyTechnologyCo.,Ltd
@@ -14,38 +13,46 @@ import java.util.concurrent.LinkedBlockingQueue;
  **/
 public class NettyMessageQueue {
     //队列大小
-    static final int QUEUE_MAX_SIZE   = 20000;
+    static final int QUEUE_MAX_SIZE = 20000;
 
     static BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>(QUEUE_MAX_SIZE);
 
     /**
      * 私有的默认构造子,保证外界无法直接实例化
      */
-    private NettyMessageQueue(){};
-    /**
-     * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
-     * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
-     */
-    private static class SingletonHolder{
-        /**
-         * 静态初始化器,由JVM来保证线程安全
-         */
-        private  static NettyMessageQueue queue = new NettyMessageQueue();
+    private NettyMessageQueue() {
     }
+
+    ;
+
     //单例队列
-    public static NettyMessageQueue getNettyMessageQueue(){
+    public static NettyMessageQueue getNettyMessageQueue() {
         return SingletonHolder.queue;
     }
+
     //生产入队
-    public  void  produce(String commandResult) throws InterruptedException {
+    public void produce(String commandResult) throws InterruptedException {
         blockingQueue.put(commandResult);
     }
+
     //消费出队
-    public  String consume() throws InterruptedException {
+    public String consume() throws InterruptedException {
         return blockingQueue.take();
     }
+
     // 获取队列大小
     public int size() {
         return blockingQueue.size();
     }
+
+    /**
+     * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
+     * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
+     */
+    private static class SingletonHolder {
+        /**
+         * 静态初始化器,由JVM来保证线程安全
+         */
+        private static NettyMessageQueue queue = new NettyMessageQueue();
+    }
 }

+ 8 - 11
src/main/java/com/persagy/job/SpringSchedule.java

@@ -4,11 +4,8 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.TimeInterval;
 import com.persagy.client.GroupNettyClient;
 import com.persagy.entity.NettyMessage;
-import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
@@ -28,20 +25,20 @@ public class SpringSchedule {
     @Autowired
     GroupNettyClient groupNettyClient;
 
-    @Scheduled(cron="${alarm.get.all.alarmdefine.cron}")
+    @Scheduled(cron = "${alarm.get.all.alarmdefine.cron}")
     public void allResetCron() throws InterruptedException {
-        NettyMessage message = new NettyMessage(4,groupNettyClient.projectId);
+        NettyMessage message = new NettyMessage(4, groupNettyClient.getProjectId());
         groupNettyClient.sendMessage(message.toString());
     }
 
 
-    @Scheduled(initialDelay=1000, fixedDelay=600000)
+    @Scheduled(initialDelay = 1000, fixedDelay = 600000)
     public void connectAnalizeCron() {
-        if(Objects.isNull(GroupNettyClient.channelGroup)) {
+        if (Objects.isNull(GroupNettyClient.channelGroup)) {
             log.warn("NettyClient is not init");
             return;
         }
-        log.info("NettyClient State:isActive[{}],isOpen[{}],isRegistered[{}],isWritable[{}]",GroupNettyClient.channelGroup.isActive(),GroupNettyClient.channelGroup.isOpen(),GroupNettyClient.channelGroup.isRegistered(),GroupNettyClient.channelGroup.isWritable());
+        log.info("NettyClient State:isActive[{}],isOpen[{}],isRegistered[{}],isWritable[{}]", GroupNettyClient.channelGroup.isActive(), GroupNettyClient.channelGroup.isOpen(), GroupNettyClient.channelGroup.isRegistered(), GroupNettyClient.channelGroup.isWritable());
         sengAlarmMessage();
     }
 
@@ -49,13 +46,13 @@ public class SpringSchedule {
         try {
             log.info("--sengAlarmMessage--");
             TimeInterval timer = DateUtil.timer();
-            while (NettyMessageQueue.getNettyMessageQueue().size()>0 && timer.interval() < 100000){
+            while (NettyMessageQueue.getNettyMessageQueue().size() > 0 && timer.interval() < 100000) {
                 String msg = NettyMessageQueue.getNettyMessageQueue().consume();
-                log.info("剩余报警消息令总数:{}",NettyMessageQueue.getNettyMessageQueue().size());
+                log.info("剩余报警消息令总数:{}", NettyMessageQueue.getNettyMessageQueue().size());
                 groupNettyClient.sendMessage(msg);
             }
         } catch (Exception e) {
-            log.error("发送报警消息失败",e);
+            log.error("发送报警消息失败", e);
         }
     }
 

+ 2 - 3
src/main/java/com/persagy/repository/AlarmRecordRepository.java

@@ -10,9 +10,8 @@ import org.springframework.stereotype.Repository;
 public interface AlarmRecordRepository extends PagingAndSortingRepository<ZktAlarmRecordDO, String> {
 
 
-    @Query(value = "SELECT * FROM zkt_alarm_record a WHERE a.item_code = :itemCode and a.obj_id = :objId" , nativeQuery = true)
-    ZktAlarmRecordDO findByItemCodeAndObjId(@Param("itemCode") String itemCode,@Param("objId") String objId);
-
+    @Query(value = "SELECT * FROM zkt_alarm_record a WHERE a.item_code = :itemCode and a.obj_id = :objId", nativeQuery = true)
+    ZktAlarmRecordDO findByItemCodeAndObjId(@Param("itemCode") String itemCode, @Param("objId") String objId);
 
 
 }

+ 3 - 7
src/main/java/com/persagy/service/impl/AlarmDefineServiceImpl.java

@@ -1,10 +1,7 @@
 package com.persagy.service.impl;
 
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
 import com.persagy.cache.AlarmInfoCache;
 import com.persagy.entity.AlarmDefine;
-import com.persagy.entity.NettyMessage;
 import com.persagy.service.AlarmDefineService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -82,12 +79,11 @@ public class AlarmDefineServiceImpl implements AlarmDefineService {
     }
 
     /**
-     * @description:批量修改(添加)报警定义
-     * (根据报警条目+对象Id先删除,再添加)
+     * @param alarmDefineList:
+     * @description:批量修改(添加)报警定义 (根据报警条目+对象Id先删除,再添加)
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param alarmDefineList:
      * @return: void
      * @since: 2020/10/26 20:38
      * @version: V1.0
@@ -101,11 +97,11 @@ public class AlarmDefineServiceImpl implements AlarmDefineService {
     }
 
     /**
+     * @param alarmDefineList:
      * @description:根据标号功能号删除报警定义
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param alarmDefineList:
      * @return: void
      * @since: 2020/10/29 18:26
      * @version: V1.0

+ 45 - 46
src/main/java/com/persagy/service/impl/AlarmHandleServiceImpl.java

@@ -1,10 +1,8 @@
 package com.persagy.service.impl;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.google.common.collect.Maps;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.Expression;
 import com.persagy.cache.AlarmInfoCache;
@@ -52,27 +50,27 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
     @Autowired
     AlarmRecordRepository alarmRecordRepository;
     /**
+     * 项目名称
+     */
+    @Value("${project.id}")
+    private String projectId;
+    /**
      * 集团编码
      */
     @Value("${group.code}")
-    public String groupCode;
+    private String groupCode;
     /**
      * 系统标识,用于创建人
      */
     @Value("${system.id}")
-    public String systemId;
+    private String systemId;
 
     /**
-     * 项目名称
-     */
-    @Value("${project.id}")
-    String projectId;
-    /**
+     * @param msg:
      * @description:处理iot采集数据
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param msg:
      * @return: void
      * @since: 2020/10/27 14:28
      * @version: V1.0
@@ -120,7 +118,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     Expression endExp = AviatorEvaluator.compile(end, true);
                     Boolean triggerResult = (Boolean) triggerExp.execute(paramMap);
                     Boolean endResult = (Boolean) endExp.execute(paramMap);
-                    log.info("triggerResult:[{}],endResult:[{}]" , triggerResult,endResult);
+                    log.info("triggerResult:[{}],endResult:[{}]", triggerResult, endResult);
                     if (triggerResult && endResult) {
                         log.warn("报警触发条件和报警恢复条件同时满足,请检查,报警定义详情【{}】", alarmDefine.toString());
                     }
@@ -129,10 +127,10 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                         //默认正常报警状态
                         alarmState = new AlarmState(defineId);
                         Optional<ZktAlarmRecordDO> recordOptional = alarmRecordRepository.findById(defineId);
-                        if(recordOptional.isPresent()){
+                        if (recordOptional.isPresent()) {
                             ZktAlarmRecordDO alarmRecordDO = recordOptional.get();
                             //数据库报警状态:1-未处理
-                            if("1".equals(alarmRecordDO.getState())){
+                            if ("1".equals(alarmRecordDO.getState())) {
                                 alarmState.setState(AlarmState.State.NOT_DEAL.getType());
                                 alarmState.setAlarmStartTime(alarmRecordDO.getAlarmTime());
                             }
@@ -141,16 +139,16 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     //报警产生值满足(这里的满足不考虑报警持续时间)
                     if (triggerResult) {
                         log.info("有一条满足报警条件");
-                        log.info("--"+alarmDefine.toString());
-                        log.info("--"+JSONObject.toJSONString(paramMap));
+                        log.info("--" + alarmDefine.toString());
+                        log.info("--" + JSONObject.toJSONString(paramMap));
                         //报警的时候不考虑报警恢复,因为同时报警和报警恢复是不应该出现的
-                        handlerNowDataAlarm(alarmDefine, alarmState, dateTime, condition, defineId,paramMap,meterId,funcId,value);
+                        handlerNowDataAlarm(alarmDefine, alarmState, dateTime, condition, defineId, paramMap, meterId, funcId, value);
                     } else {
                         log.info("不满足报警条件");
-                        log.info("--"+alarmDefine.toString());
-                        log.info("--"+JSONObject.toJSONString(paramMap));
+                        log.info("--" + alarmDefine.toString());
+                        log.info("--" + JSONObject.toJSONString(paramMap));
                         //当前数据正常
-                        handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState,paramMap,meterId,funcId,value);
+                        handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState, paramMap, meterId, funcId, value);
                     }
                 } else {
                     log.warn("部分信息点没有数值:[{}]", codeDetail);
@@ -161,15 +159,15 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
 
     /**
      * @param alarmDefine :       报警定义
-     * @param dateTime :IOT采集时间
-     * @param condition :报警条件
-     * @param defineId :报警定义ID
-     * @param endResult :报警恢复监测结果
-     * @param alarmState :        报警状态时间实体
-     * @param paramMap   报警恢复触发值
-     * @param meterId:  表号
-     * @param funcId: 功能号
-     * @param value:  数值
+     * @param dateTime    :IOT采集时间
+     * @param condition   :报警条件
+     * @param defineId    :报警定义ID
+     * @param endResult   :报警恢复监测结果
+     * @param alarmState  :        报警状态时间实体
+     * @param paramMap    报警恢复触发值
+     * @param meterId:    表号
+     * @param funcId:     功能号
+     * @param value:      数值
      * @description:当前数据正常判断逻辑
      * @exception:
      * @author: LuoGuangyi
@@ -202,8 +200,8 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
             int uphold = condition.getEndUphold();
             //超过报警恢复设置的持续时间
             if (DateUtils.betweenTwoTimeSecond(endTime, dateTime) >= uphold) {
-                log.error("产生一条报警恢复消息[{}]>[{}]",DateUtils.betweenTwoTimeSecond(endTime, dateTime),uphold);
-                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6,projectId);
+                log.error("产生一条报警恢复消息[{}]>[{}]", DateUtils.betweenTwoTimeSecond(endTime, dateTime), uphold);
+                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6, projectId);
                 ZktAlarmRecordDO alarmRecordDO = alarmRecordRepository.findById(AlarmInfoCache.getAlarmDefineId(alarmDefine)).orElse(new ZktAlarmRecordDO());
                 alarmRecordDO.setDefinitionId(defineId);
                 alarmRecordDO.setObjId(alarmDefine.getObjId());
@@ -224,12 +222,12 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                         .endInfo(JSONObject.toJSONString(paramMap))
                         .build();
                 //如果有报警ID,直接报警恢复
-                if(StringUtils.isNotEmpty(alarmId)) {
+                if (StringUtils.isNotEmpty(alarmId)) {
                     alarmResumeRecord.setId(alarmId);
                     nettyMessage.setContent(Arrays.asList(alarmResumeRecord));
                     //{"id","123", "state":1, "groupCode":"wd", "projectId":"Pj123","endTime":"","endInfo":""}
                     groupNettyClient.sendMessage(nettyMessage.toString());
-                }else {
+                } else {
                     //如果没有报警ID,定时任务再次测试
                     JobDataMap jobDataMap = new JobDataMap();
                     jobDataMap.put("alarmRecord", alarmRecordDO.toString());
@@ -244,7 +242,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     ExpireAlarmMessage em = new ExpireAlarmMessage();
                     //过期消息
                     em.setType("1");
-                    em.setStartTime(DateUtil.offsetMinute(new Date(),3).toJdkDate());
+                    em.setStartTime(DateUtil.offsetMinute(new Date(), 3).toJdkDate());
                     em.setJobDataMap(jobDataMap);
                     em.setJobName(jobName);
                     em.setJobGroupName("resume");
@@ -271,9 +269,9 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
      * @param condition   :报警定义条件
      * @param defineId    :报警定义ID
      * @param paramMap    报警触发值
-     * @param meterId    表号
-     * @param funcId    功能号
-     * @param value     IOT采集数值
+     * @param meterId     表号
+     * @param funcId      功能号
+     * @param value       IOT采集数值
      * @description:处理当前值报警的情况
      * @exception:
      * @author: LuoGuangyi
@@ -290,17 +288,17 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
         //没有设置生效时间,所以也没有设置过期时间
         boolean hasExpire = false;
         JSONObject period = effectTime.getJSONObject("period");
-        if(ObjectUtil.isAllNotEmpty(effectTime,effectTime.getString("type"))) {
+        if (ObjectUtil.isAllNotEmpty(effectTime, effectTime.getString("type"))) {
             if ("period".equals(effectTime.getString("type"))) {
                 //开始结束时间都不为空
                 String startTime = period.getString("startTime");
                 String endTime = period.getString("endTime");
                 String dateTimeFormat = DateUtils.getSdfTimeNotDate(dateTime);
-                if(ObjectUtil.isAllNotEmpty(startTime, endTime)){
-                    if(!"000000".equals(startTime) || !"235959".equals(endTime)){
+                if (ObjectUtil.isAllNotEmpty(startTime, endTime)) {
+                    if (!"000000".equals(startTime) || !"235959".equals(endTime)) {
                         hasExpire = true;
                     }
-                    if(startTime.compareTo(dateTimeFormat) > 0 || endTime.compareTo(DateUtils.getSdfTimeNotDate(dateTime)) < 0){
+                    if (startTime.compareTo(dateTimeFormat) > 0 || endTime.compareTo(DateUtils.getSdfTimeNotDate(dateTime)) < 0) {
                         inEffectTime = false;
                     }
                 }
@@ -319,10 +317,8 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
         }
         alarmInfoCache.setAlarmState(defineId, alarmState);
     }
+
     /**
-     * @description: 生成报警记录和报警恢复消息(对报警定义加锁)
-     * @author: LuoGuangyi
-     * @createTime: 2020/12/28 18:21
      * @param alarmDefine:
      * @param alarmState:
      * @param dateTime:
@@ -332,6 +328,9 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
      * @param effectTime:
      * @param hasExpire:
      * @param period:
+     * @description: 生成报警记录和报警恢复消息(对报警定义加锁)
+     * @author: LuoGuangyi
+     * @createTime: 2020/12/28 18:21
      * @return: void
      * @expression
      */
@@ -339,7 +338,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
         long timeSecond = 0;
         if (StringUtil.isNotEmpty(alarmState.getAlarmStartTime())) {
             timeSecond = DateUtils.betweenTwoTimeSecond(alarmState.getAlarmStartTime(), dateTime);
-        }else {
+        } else {
             //设置开始报警时间
             alarmState.setAlarmStartTime(dateTime);
         }
@@ -354,7 +353,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
         }
 
         if (timeSecond >= condition.getTriggerUphold()) {
-            log.warn("大于持续时间了,产生一条报警[{}]>[{}]",timeSecond, condition.getTriggerUphold());
+            log.warn("大于持续时间了,产生一条报警[{}]>[{}]", timeSecond, condition.getTriggerUphold());
             AlarmRecord alarmRecord = AlarmRecord.builder()
                     .category(alarmDefine.getCategory())
                     .concern(alarmDefine.getConcern())
@@ -374,7 +373,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     .classCode(alarmDefine.getClassCode())
                     .createUser(systemId)
                     .build();
-            NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(5,projectId);
+            NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(5, projectId);
             nettyMessage.setContent(Arrays.asList(alarmRecord));
             //推送一条报警记录给远端
             groupNettyClient.sendMessage(nettyMessage.toString());

+ 16 - 17
src/main/java/com/persagy/service/impl/AlarmQuartzServiceImpl.java

@@ -1,9 +1,7 @@
 package com.persagy.service.impl;
 
 import cn.hutool.core.date.DateUtil;
-import com.persagy.entity.ExpireAlarmMessage;
 import com.persagy.job.AlarmExpireJob;
-import com.persagy.job.ExpireAlarmQueue;
 import com.persagy.service.AlarmQuartzService;
 import com.persagy.utils.DateUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -12,8 +10,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
-import java.util.*;
+import java.util.Date;
+import java.util.HashSet;
 
 import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
 
@@ -35,30 +33,31 @@ public class AlarmQuartzServiceImpl implements AlarmQuartzService {
 
     /**
      * 添加定时器
-     * @param startTime 添加报警恢复定时任务
-     * @param jobName   job名称
-     * @param jobGroupName  job分组
-     * @param jobDataMap  触发器的数据(任务相关的数据都放在这里)
-     * @return 
+     *
+     * @param startTime    添加报警恢复定时任务
+     * @param jobName      job名称
+     * @param jobGroupName job分组
+     * @param jobDataMap   触发器的数据(任务相关的数据都放在这里)
+     * @return
      * @throws SchedulerException
      */
     @Override
     public String addExpireJob(Date startTime, String jobName, String jobGroupName, JobDataMap jobDataMap) throws SchedulerException {
-        if(startTime.before(new Date())){
+        if (startTime.before(new Date())) {
             log.error("执行时间【{}】为历史时间,继续添加", DateUtils.formatDate(startTime));
         }
         JobKey jobKey = new JobKey(jobName, jobGroupName);
         JobDetail jobDetail = JobBuilder.newJob(AlarmExpireJob.class).withIdentity(jobKey).requestRecovery().build();
         Trigger trigger = TriggerBuilder.newTrigger().startAt(startTime)
-                .withIdentity("trigger_" + jobName , jobGroupName)
+                .withIdentity("trigger_" + jobName, jobGroupName)
                 .usingJobData(jobDataMap)
                 .withSchedule(simpleSchedule().withMisfireHandlingInstructionIgnoreMisfires()).build();
         //已经存在的job实例和触发器自动覆盖 job实 例 唯 一标识:
         HashSet<Trigger> triggerSet = new HashSet<Trigger>();
-        Date fireTime = trigger.getFireTimeAfter(DateUtil.offsetMinute(startTime,-1).toJdkDate());
-        if(fireTime != null){
-            log.info("执行时间为:【{}】,设置时间为【{}】",DateUtils.formatDate(fireTime),DateUtils.formatDate(startTime));
-        }else {
+        Date fireTime = trigger.getFireTimeAfter(DateUtil.offsetMinute(startTime, -1).toJdkDate());
+        if (fireTime != null) {
+            log.info("执行时间为:【{}】,设置时间为【{}】", DateUtils.formatDate(fireTime), DateUtils.formatDate(startTime));
+        } else {
             log.info("执行时间为 空!");
         }
         triggerSet.add(trigger);
@@ -68,12 +67,12 @@ public class AlarmQuartzServiceImpl implements AlarmQuartzService {
 
 
     /**
+     * @param jobName:job名称
+     * @param jobGroupName:job分组名称
      * @description:删除定时任务
      * @exception:
      * @author: LuoGuangyi
      * @company: Persagy Technology Co.,Ltd
-     * @param jobName:job名称
-     * @param jobGroupName:job分组名称
      * @return: java.lang.String
      * @since: 2020/09/29 9:23
      * @version: V1.0

+ 7 - 8
src/main/java/com/persagy/service/impl/RunScriptExample.java

@@ -7,19 +7,18 @@ package com.persagy.service.impl;
  * @since:2020/10/17 001710:12
  * @version:V1.0
  **/
+
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.TimeInterval;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.Expression;
-import com.googlecode.aviator.Options;
 
 import java.util.Arrays;
 
 /**
  * Run a script under examples folder.
  *
- * @author dennis(killme2008@gmail.com)
- *
+ * @author dennis(killme2008 @ gmail.com)
  */
 public class RunScriptExample {
 
@@ -30,24 +29,24 @@ public class RunScriptExample {
         String expression = "$a-($b-$c) > 100";
         String expression2 = "$a-($b-$c) > 200";
         String expression3 = "$a-($b-$c) > 200";
-        Expression compiledExp = AviatorEvaluator.compile(expression,true);
-        Expression compiledExp2 = AviatorEvaluator.compile(expression2,true);
+        Expression compiledExp = AviatorEvaluator.compile(expression, true);
+        Expression compiledExp2 = AviatorEvaluator.compile(expression2, true);
         System.out.println(AviatorEvaluator.getInstance().getExpressionCacheSize());
         Boolean result1 = (Boolean) compiledExp.execute(compiledExp.newEnv("$a", 100.3, "$b", 45, "$c", -199.100));
         Boolean result2 = (Boolean) compiledExp.execute(compiledExp2.newEnv("$a", 100.3, "$b", 45, "$c", -199.100));
 
         System.out.println(AviatorEvaluator.getInstance().getExpressionCacheSize());
 
-        Expression exp = AviatorEvaluator.getInstance().compileScript("statements.av",true);
+        Expression exp = AviatorEvaluator.getInstance().compileScript("statements.av", true);
         System.out.println(AviatorEvaluator.getInstance().getExpressionCacheSize());
         for (int i = 0; i < 10000; i++) {
-            Object result = exp.execute(exp.newEnv("$a", 100.3, "$b", 45, "$c", -199.100,"$list", Arrays.asList(1,3)));
+            Object result = exp.execute(exp.newEnv("$a", 100.3, "$b", 45, "$c", -199.100, "$list", Arrays.asList(1, 3)));
 //            System.out.println(result);
         }
         //花费毫秒数
         System.out.println(timer.interval());
         timer.intervalRestart();
-        Expression compiledExp3 = AviatorEvaluator.compile(expression3,true);
+        Expression compiledExp3 = AviatorEvaluator.compile(expression3, true);
         for (int i = 0; i < 50000; i++) {
             Boolean result3 = (Boolean) compiledExp.execute(compiledExp3.newEnv("$a", 100.3, "$b", i, "$c", -199.100));
         }

+ 9 - 8
src/main/java/com/persagy/utils/DataUtils.java

@@ -18,6 +18,8 @@ import java.util.Map;
  */
 public class DataUtils {
 
+    private static final int DECIMAL_SCALE = 12;
+
     /**
      * 对象转Double类型
      *
@@ -101,9 +103,8 @@ public class DataUtils {
         return dividendDecimal.divide(divisorDecimal, decimalScale, BigDecimal.ROUND_HALF_UP).doubleValue();
     }
 
-    private static final int DECIMAL_SCALE = 12;
     public static <T extends Number> Double divide(T dividend, T divisor) throws Exception {
-        return divide(dividend,divisor,DECIMAL_SCALE);
+        return divide(dividend, divisor, DECIMAL_SCALE);
     }
 
     public static Double subtract(Double minuend, Double subtrahend) {
@@ -161,9 +162,9 @@ public class DataUtils {
 
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-	public static void sortList(List srcList, String sortField, boolean isAsc) throws Exception{
-        if(CollectionUtils.isEmpty(srcList)){
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public static void sortList(List srcList, String sortField, boolean isAsc) throws Exception {
+        if (CollectionUtils.isEmpty(srcList)) {
             return;
         }
         Collections.sort(srcList, (o1, o2) -> {
@@ -199,7 +200,6 @@ public class DataUtils {
     }
 
 
-
     public static void sortList(List<Double> energyList) {
         Collections.sort(energyList, (o1, o2) -> {
             if (o1 == null && o2 == null) {
@@ -237,12 +237,13 @@ public class DataUtils {
 
     /**
      * description 筛选originMapList中包含keyWord的对象
+     *
      * @param originMapList
      * @param keyWord
-     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
+     * @return java.util.List<java.util.Map < java.lang.String, java.lang.Object>>
      * @author feng
-     * @since 19:47 2020/6/4
      * @version 1.0
+     * @since 19:47 2020/6/4
      */
     public static List<Map<String, Object>> queryByKeyWord(List<Map<String, Object>> originMapList, String keyWord) {
         if (StringUtils.isBlank(keyWord)) {

File diff suppressed because it is too large
+ 312 - 318
src/main/java/com/persagy/utils/DateUtils.java


+ 32 - 32
src/main/java/com/persagy/utils/GZIPCompressUtil.java

@@ -8,38 +8,38 @@ import java.util.zip.GZIPOutputStream;
 
 public class GZIPCompressUtil {
 
-	public static String compress(String str) throws IOException {
-		if (str == null || str.length() == 0) {
-			return str;
-		}
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		GZIPOutputStream gzip = new GZIPOutputStream(out);
-		gzip.write(str.getBytes());
-		gzip.close();
-		return out.toString("ISO-8859-1");
-	}
+    public static String compress(String str) throws IOException {
+        if (str == null || str.length() == 0) {
+            return str;
+        }
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        GZIPOutputStream gzip = new GZIPOutputStream(out);
+        gzip.write(str.getBytes());
+        gzip.close();
+        return out.toString("ISO-8859-1");
+    }
 
-	public static String uncompress(String str) throws IOException {
-		String message = new String(GZIPCompressUtil.uncompress(str.getBytes("ISO-8859-1")));
-		return message;
-	}
+    public static String uncompress(String str) throws IOException {
+        String message = new String(GZIPCompressUtil.uncompress(str.getBytes("ISO-8859-1")));
+        return message;
+    }
 
-	public static byte[] uncompress(byte[] bytes) {
-		if (bytes == null || bytes.length == 0) {
-			return null;
-		}
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		ByteArrayInputStream in = new ByteArrayInputStream(bytes);
-		try {
-			GZIPInputStream ungzip = new GZIPInputStream(in);
-			byte[] buffer = new byte[256];
-			int n;
-			while ((n = ungzip.read(buffer)) >= 0) {
-				out.write(buffer, 0, n);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return out.toByteArray();
-	}
+    public static byte[] uncompress(byte[] bytes) {
+        if (bytes == null || bytes.length == 0) {
+            return null;
+        }
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+        try {
+            GZIPInputStream ungzip = new GZIPInputStream(in);
+            byte[] buffer = new byte[256];
+            int n;
+            while ((n = ungzip.read(buffer)) >= 0) {
+                out.write(buffer, 0, n);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return out.toByteArray();
+    }
 }

+ 20 - 21
src/main/java/com/persagy/utils/LockUtil.java

@@ -1,6 +1,5 @@
 package com.persagy.utils;
 
-import cn.hutool.core.date.DateUtil;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.concurrent.ExecutorService;
@@ -23,18 +22,21 @@ public class LockUtil {
 
     //创建 SingleObject 的一个对象
     private static LockUtil instance = new LockUtil();
+    public Lock lock = new ReentrantLock();
+    public Condition condition = lock.newCondition();
+    AtomicInteger num = new AtomicInteger(0);
+    private volatile boolean execute = true;
 
-    private LockUtil(){}
+    private LockUtil() {
+    }
 
-    public static LockUtil getInstance(){
+    public static LockUtil getInstance() {
         return instance;
     }
 
-    public Lock lock = new ReentrantLock();
-    public Condition condition = lock.newCondition();
-
-    private volatile boolean execute = true;
-    AtomicInteger num = new AtomicInteger(0);
+    public static void main(String[] args) throws InterruptedException {
+        LockUtil.getInstance().await();
+    }
 
     public boolean isExecute() {
         return execute;
@@ -44,35 +46,32 @@ public class LockUtil {
         this.execute = execute;
     }
 
-    public static void main(String[] args) throws InterruptedException {
-        LockUtil.getInstance().await();
-    }
     public void await() throws InterruptedException {
         System.out.println("----------");
 
         ExecutorService executorService = Executors.newFixedThreadPool(5);
         for (int j = 0; j < 20; j++) {
-            executorService.execute(()->{
+            executorService.execute(() -> {
                 for (int i = 0; i < 100000; i++) {
                     try {
                         Thread.sleep(1000);
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
-                    if(LockUtil.getInstance().isExecute()){
+                    if (LockUtil.getInstance().isExecute()) {
                         System.out.println(num.getAndIncrement());
-                    }else {
+                    } else {
                         lock.lock();
                         try {
 
-                            log.info("["+Thread.currentThread().getName()+"]"+"等待[{}]",lock);
+                            log.info("[" + Thread.currentThread().getName() + "]" + "等待[{}]", lock);
                             try {
                                 condition.await();
                             } catch (InterruptedException e) {
                                 e.printStackTrace();
                             }
-                            log.info("["+Thread.currentThread().getName()+"]"+"等待执行"+num.getAndIncrement());
-                        }finally {
+                            log.info("[" + Thread.currentThread().getName() + "]" + "等待执行" + num.getAndIncrement());
+                        } finally {
                             lock.unlock();
                         }
 
@@ -82,14 +81,14 @@ public class LockUtil {
         }
 
 
-        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(()->{
+        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
             lock.lock();
             try {
                 LockUtil.getInstance().setExecute(!LockUtil.getInstance().isExecute());
                 //加个等待,保证正在执行的逻辑执行成功
                 Thread.sleep(1000);
-                if(LockUtil.getInstance().isExecute()){
-                    log.info("["+Thread.currentThread().getName()+"]"+"signalAll");
+                if (LockUtil.getInstance().isExecute()) {
+                    log.info("[" + Thread.currentThread().getName() + "]" + "signalAll");
                     condition.signalAll();
                 }
             } catch (InterruptedException e) {
@@ -98,7 +97,7 @@ public class LockUtil {
                 lock.unlock();
             }
 
-        },0,3, TimeUnit.SECONDS);
+        }, 0, 3, TimeUnit.SECONDS);
     }
 
 }

+ 7 - 7
src/main/java/com/persagy/utils/NetworkUtil.java

@@ -31,32 +31,32 @@ public class NetworkUtil {
             log.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
         }
 
-        if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {
-            if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                 ip = request.getHeader("Proxy-Client-IP");
                 if (log.isInfoEnabled()) {
                     log.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
                 }
             }
-            if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                 ip = request.getHeader("WL-Proxy-Client-IP");
                 if (log.isInfoEnabled()) {
                     log.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
                 }
             }
-            if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                 ip = request.getHeader("HTTP_CLIENT_IP");
                 if (log.isInfoEnabled()) {
                     log.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
                 }
             }
-            if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                 ip = request.getHeader("HTTP_X_FORWARDED_FOR");
                 if (log.isInfoEnabled()) {
                     log.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
                 }
             }
-            if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                 ip = request.getRemoteAddr();
                 if (log.isInfoEnabled()) {
                     log.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
@@ -66,7 +66,7 @@ public class NetworkUtil {
             String[] ips = ip.split(",");
             for (int index = 0; index < ips.length; index++) {
                 String strIp = (String) ips[index];
-                if (!("unknown" .equalsIgnoreCase(strIp))) {
+                if (!("unknown".equalsIgnoreCase(strIp))) {
                     ip = strIp;
                     break;
                 }

+ 8 - 9
src/main/java/com/persagy/utils/StringUtil.java

@@ -1,6 +1,5 @@
 package com.persagy.utils;
 
-import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -11,7 +10,6 @@ import org.apache.commons.text.StringEscapeUtils;
 import org.springframework.util.CollectionUtils;
 
 import java.lang.reflect.Array;
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -243,6 +241,7 @@ public class StringUtil {
             setObject.put(key, value);
         }
     }
+
     /**
      * Is json object boolean.
      *
@@ -252,7 +251,7 @@ public class StringUtil {
     public static boolean isJSONObject(String content) {
         try {
             Object jsobj = JSONObject.parse(content);
-            if(jsobj instanceof JSONObject){
+            if (jsobj instanceof JSONObject) {
                 return true;
             }
             return false;
@@ -270,7 +269,7 @@ public class StringUtil {
     public static boolean isJSONArray(String content) {
         try {
             Object jsobj = JSONObject.parse(content);
-            if(jsobj instanceof JSONArray){
+            if (jsobj instanceof JSONArray) {
                 return true;
             }
             return false;
@@ -458,17 +457,17 @@ public class StringUtil {
         System.out.println("目标 str1 = " + str1);
         Random r = new Random();
         for (int i = 0; i < 20; i++) {
-            System.out.println(i+"---"+r.nextInt(2));
+            System.out.println(i + "---" + r.nextInt(2));
         }
         JSONObject paramMap = new JSONObject();
-        paramMap.put("hello",6);
-        paramMap.put("X",3);
-        paramMap.put("Y",6);
+        paramMap.put("hello", 6);
+        paramMap.put("X", 3);
+        paramMap.put("Y", 6);
 //        String exp = "X < seq.min(seq.list(decimal(1), decimal(2.5), decimal(hello), decimal(3.14)))";
 //        String exp = "X < seq.min(seq.list(1, 2.5, 3.14))";
         String exp = "X == 3.0000";
         Expression expExp = AviatorEvaluator.compile(exp, true);
         Boolean triggerResult = (Boolean) expExp.execute(paramMap);
-        System.out.println("triggerResult:"+triggerResult);
+        System.out.println("triggerResult:" + triggerResult);
     }
 }

+ 3 - 3
src/main/resources/application-39Pj1101050013.yml

@@ -7,12 +7,12 @@ group:
     #需要更改
     port: 9986          #netty 端口8826
     #需要更改
-terminal:  #边缘端IOT采集程序地址
-  alarm:  # 拼接后的地址为ws://host:port/suffix
+terminal: #边缘端IOT采集程序地址
+  alarm: # 拼接后的地址为ws://host:port/suffix
     #需要更改
     compress: false    #采用的是压缩方式还是不压缩方式  true-压缩 false-不压缩
     #需要更改
-    host:  39.96.55.242  #172.17.233.176
+    host: 39.96.55.242  #172.17.233.176
     #需要更改
     port: 9984
     #需要更改

+ 2 - 2
src/main/resources/application-39Pj5001120003.yml

@@ -7,8 +7,8 @@ group:
     #需要更改
     port: 9986          #netty 端口8826
     #需要更改
-terminal:  #边缘端IOT采集程序地址
-  alarm:  # 拼接后的地址为ws://host:port/suffix
+terminal: #边缘端IOT采集程序地址
+  alarm: # 拼接后的地址为ws://host:port/suffix
     #需要更改
     compress: false    #采用的是压缩方式还是不压缩方式  true-压缩 false-不压缩
     #需要更改

+ 2 - 2
src/main/resources/application-Pj1101080259.yml

@@ -7,8 +7,8 @@ group:
     #需要更改
     port: 8826          #云端报警服务netty 端口9986
     #需要更改
-terminal:  #边缘端IOT采集程序地址
-  alarm:  # 拼接后的地址为ws://host:port/suffix
+terminal: #边缘端IOT采集程序地址
+  alarm: # 拼接后的地址为ws://host:port/suffix
     #需要更改
     compress: false    #采用的是压缩方式还是不压缩方式  true-压缩 false-不压缩
     #需要更改

+ 3 - 3
src/main/resources/application-Pj4403070003.yml

@@ -3,12 +3,12 @@ group:
   code: WD   #标识哪个接团 比如万达使用WD
   alarm:
     #需要更改
-    host: 39.102.43.179 #netty IP
+    host: 39.102.43.179 #netty IP  127.0.0.1
     #需要更改
     port: 9986          #netty 端口8826
     #需要更改
-terminal:  #边缘端IOT采集程序地址
-  alarm:  # 拼接后的地址为ws://host:port/suffix
+terminal: #边缘端IOT采集程序地址
+  alarm: # 拼接后的地址为ws://host:port/suffix
     #需要更改
     compress: false    #采用的是压缩方式还是不压缩方式  true-压缩 false-不压缩
     #需要更改

+ 2 - 2
src/main/resources/application-Pj5001120003.yml

@@ -7,8 +7,8 @@ group:
     #需要更改
     port: 9986          #netty 端口8826
     #需要更改
-terminal:  #边缘端IOT采集程序地址
-  alarm:  # 拼接后的地址为ws://host:port/suffix
+terminal: #边缘端IOT采集程序地址
+  alarm: # 拼接后的地址为ws://host:port/suffix
     #需要更改
     compress: false    #采用的是压缩方式还是不压缩方式  true-压缩 false-不压缩
     #需要更改

+ 2 - 2
src/main/resources/application-testPj1101080259.yml

@@ -7,8 +7,8 @@ group:
     #需要更改
     port: 8826          #云端报警服务netty 端口9986
     #需要更改
-terminal:  #边缘端IOT采集程序地址
-  alarm:  # 拼接后的地址为ws://host:port/suffix
+terminal: #边缘端IOT采集程序地址
+  alarm: # 拼接后的地址为ws://host:port/suffix
     #需要更改
     compress: false    #采用的是压缩方式还是不压缩方式  true-压缩 false-不压缩
     #需要更改

+ 10 - 13
src/main/resources/quartz.properties

@@ -4,28 +4,25 @@ org.quartz.scheduler.instanceName=quartzScheduler
 org.quartz.scheduler.instanceId=AUTO
 # 如果您希望Quartz Scheduler通过RMI作为服务器导出本身,则将“rmi.export”标志设置为true。
 # 在同一个配置文件中为'org.quartz.scheduler.rmi.export'和'org.quartz.scheduler.rmi.proxy'指定一个'true'值是没有意义的,如果你这样做,'export '选项将被忽略
-org.quartz.scheduler.rmi.export = false
+org.quartz.scheduler.rmi.export=false
 # 如果要连接(使用)远程服务的调度程序,则将“org.quartz.scheduler.rmi.proxy”标志设置为true。您还必须指定RMI注册表进程的主机和端口 - 通常是“localhost”端口
-org.quartz.scheduler.rmi.proxy = false
+org.quartz.scheduler.rmi.proxy=false
 # 事务包裹
-org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
+org.quartz.scheduler.wrapJobExecutionInUserTransaction=false
 # 实例化ThreadPool时,使用的线程类为SimpleThreadPool
-org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
-
+org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
 # threadCount和threadPriority将以setter的形式注入ThreadPool实例
 # 并发个数
-org.quartz.threadPool.threadCount = 10
-org.quartz.threadPool.threadPriority = 5
-org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
-
+org.quartz.threadPool.threadCount=10
+org.quartz.threadPool.threadPriority=5
+org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
 ## 默认存储在内存中
 #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
 #持久化
-org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
+org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
 org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
-
-org.quartz.jobStore.tablePrefix = ZKT_ALARM_
-org.quartz.jobStore.isClustered = true
+org.quartz.jobStore.tablePrefix=ZKT_ALARM_
+org.quartz.jobStore.isClustered=true
 #设置此实例“检入”*与群集的其他实例的频率(以毫秒为单位)。影响检测失败实例的速度。
 org.quartz.jobStore.clusterCheckinInterval=10000
 #可以将“org.quartz.jobStore.useProperties”配置参数设置为“true”(默认为false),以指示JDBCJobStore将JobDataMaps中的所有值都作为字符串,

+ 9 - 10
src/test/java/com/persagy/zktprojectalarm/Mytest.java

@@ -7,7 +7,6 @@ import com.persagy.cache.AlarmInfoCache;
 import com.persagy.entity.AlarmDefine;
 import com.persagy.service.AlarmDefineService;
 import com.persagy.utils.LockUtil;
-
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -29,23 +28,23 @@ public class Mytest {
     AlarmInfoCache alarmInfoCache;
 
     @Test
-    public void test1 () throws Exception {
+    public void test1() throws Exception {
         LockUtil.getInstance().await();
         new CountDownLatch(1).await();
     }
 
 
     @Test
-    public void test2 () throws Exception {
+    public void test2() throws Exception {
         alarmDefineService.listAllAlarmDefine(new ArrayList<>());
         ConcurrentHashMap<String, AlarmDefine> alarmDefineMap = alarmInfoCache.getAlarmDefineMap();
-        for (Map.Entry entry :alarmDefineMap.entrySet()) {
-            System.out.println("[key]:"+entry.getKey()+"[value]"+entry.getValue());
+        for (Map.Entry entry : alarmDefineMap.entrySet()) {
+            System.out.println("[key]:" + entry.getKey() + "[value]" + entry.getValue());
         }
         System.out.println("--------------------");
         ConcurrentHashMap<String, List<AlarmDefine>> infoAlarmMap = alarmInfoCache.getInfoAlarmMap();
-        for (Map.Entry entry :infoAlarmMap.entrySet()) {
-            System.out.println("[key]:"+entry.getKey()+"[value]"+ JSONObject.toJSONString(entry.getValue()));
+        for (Map.Entry entry : infoAlarmMap.entrySet()) {
+            System.out.println("[key]:" + entry.getKey() + "[value]" + JSONObject.toJSONString(entry.getValue()));
         }
 
         new CountDownLatch(1).await();
@@ -53,10 +52,10 @@ public class Mytest {
 
 
     @Test
-    public void test3 () throws Exception {
-        List<String> list= Arrays.asList("WE","We","W_e","asNs","ss_Sd");
+    public void test3() throws Exception {
+        List<String> list = Arrays.asList("WE", "We", "W_e", "asNs", "ss_Sd");
         for (String column : list) {
-            System.out.println(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE,column));
+            System.out.println(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, column));
         }
         new CountDownLatch(1).await();
     }