wuzeyu
2024-11-22 8d725e7bd1ad30b5ba437cbf420da622cfefc7c6
Merge remote-tracking branch 'origin/master'
19个文件已修改
4个文件已添加
640 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreConstantManage.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreConstantThread.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreConstantTimer.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreThread.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreTimer.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreUnit.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreUnitConfigVo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ThreadJob.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/TimerTaskJob.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voUg/VoUgRtuResult.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(sp沙盘).xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(test测试).xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(ym元谋).xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeResSv.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreConstantManage.java
@@ -1,5 +1,6 @@
package com.dy.common.mw.core;
import java.util.ArrayList;
import java.util.List;
import org.apache.logging.log4j.*;
@@ -10,10 +11,12 @@
    
    private final static CoreConstantManage instance = new CoreConstantManage() ;
    private static Long sleepBigBusy = 100L ;//大忙时(除了恒久任务,还是其他任务),核心线程暂停间隔
    private static Long sleepSmallBusy = 500L ;//小忙时(只有恒久任务,无其他任务),核心线程暂停间隔
    private List<CoreConstantTimer> coreConstantTimers ;
    private Long coreInterval = 100L ;//核心线程暂停间隔
    private CoreConstantManage(){
        coreConstantTimers = new ArrayList<>() ;
    }
    
    public static CoreConstantManage getInstance(){
@@ -22,12 +25,10 @@
    
    /**
     * è®¾ç½®æš‚停时长
     * @param sleepBigBusy å¤§å¿™æ—¶ï¼ˆé™¤äº†æ’久任务,还是其他任务),核心线程暂停间隔
     * @param sleepSmallBusy å°å¿™æ—¶ï¼ˆåªæœ‰æ’久任务,无其他任务),核心线程暂停间隔
     * @param coreInterval æ ¸å¿ƒçº¿ç¨‹æš‚停间隔
     */
    public void setSleep(Long sleepBigBusy, Long sleepSmallBusy){
        CoreConstantManage.sleepBigBusy = sleepBigBusy ;
        CoreConstantManage.sleepSmallBusy = sleepSmallBusy ;
    public void setSleep(Long coreInterval){
        this.coreInterval = coreInterval ;
    }
    public void start(){
@@ -35,7 +36,8 @@
        List<CoreTask> constantTasks = CoreUnit.getAllConstantTasks();
        if (constantTasks != null && constantTasks.size() > 0) {
            for (CoreTask task : constantTasks) {
                new CoreConstantThread(sleepBigBusy, sleepSmallBusy, task).start();
                //new CoreConstantThread(sleepBigBusy, sleepSmallBusy, task).start();
                coreConstantTimers.add(new CoreConstantTimer(coreInterval, task).start());
            }
        }
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreConstantThread.java
@@ -9,6 +9,15 @@
 * @LastEditTime 2023/12/19 16:41
 * @Description
 */
/**
 * 2024-11-21 è¯¥ç±»å·²ç»å¼ƒç”¨ï¼Œæ”¹ç”±CoreConstantTimer实现。
 * å½“采用Thread实现时,在while(true){}中使用Thread.sleep(),可能导致的严重性能问题,不推荐在循环中使用线程休眠。
 * Java线程实现采用内核线程实现,线程的休眠及唤醒(状态切换)需借助操作系统进行,这是一个极其耗时耗力的操作。
 * åœ¨çº¿ç¨‹ä¼‘眠或运行时间较长的情景下,其对性能的影响还不算明显,因为对线程状态的切换并不频繁。
 * ä½†è‹¥çº¿ç¨‹ä¼‘眠及运行的时间都很短(例如毫秒/秒),
 * ç³»ç»Ÿå°†é¢‘繁的对线程状态进行切换,导致严重的性能损耗,并对着循环次数的递增而放大。
 */
@Deprecated
public class CoreConstantThread extends Thread {
    private final static Logger log = LogManager.getLogger(CoreConstantThread.class.getName()) ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreConstantTimer.java
New file
@@ -0,0 +1,45 @@
package com.dy.common.mw.core;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Timer;
import java.util.TimerTask;
/**
 * @Author: liurunyu
 * @Date: 2024/11/21 17:13
 * @Description
 */
public class CoreConstantTimer extends TimerTask {
    private final static Logger log = LogManager.getLogger(CoreConstantTimer.class.getName()) ;
    private Timer timer;
    private long coreInterval ;
    private CoreTask task ;
    public CoreConstantTimer(long coreInterval, CoreTask task){
        this.timer = new Timer();
        this.coreInterval = coreInterval ;
        this.task = task ;
    }
    public CoreConstantTimer start(){
        this.timer.schedule(this, 0 , this.coreInterval);
        return this ;
    }
    @Override
    public void run() {
        if(task != null){
            try {
                task.execute();
            } catch (Exception e) {
                log.error("恒久任务" + task.getClass().getName() + "执行时发生异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e);
            }
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreThread.java
@@ -4,6 +4,15 @@
import com.dy.common.queue.Queue;
/**
 * 2024-11-21 è¯¥ç±»å·²ç»å¼ƒç”¨ï¼Œæ”¹ç”±CoreTimer实现。
 * å½“采用Thread实现时,在while(true){}中使用Thread.sleep(),可能导致的严重性能问题,不推荐在循环中使用线程休眠。
 * Java线程实现采用内核线程实现,线程的休眠及唤醒(状态切换)需借助操作系统进行,这是一个极其耗时耗力的操作。
 * åœ¨çº¿ç¨‹ä¼‘眠或运行时间较长的情景下,其对性能的影响还不算明显,因为对线程状态的切换并不频繁。
 * ä½†è‹¥çº¿ç¨‹ä¼‘眠及运行的时间都很短(例如毫秒/秒),
 * ç³»ç»Ÿå°†é¢‘繁的对线程状态进行切换,导致严重的性能损耗,并对着循环次数的递增而放大。
 */
@Deprecated
public class CoreThread extends Thread{
    
    private static Logger log = LogManager.getLogger(CoreThread.class.getName()) ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreTimer.java
New file
@@ -0,0 +1,80 @@
package com.dy.common.mw.core;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Timer;
import java.util.TimerTask;
/**
 * @Author: liurunyu
 * @Date: 2024/11/21 13:41
 * @Description
 */
public class CoreTimer extends TimerTask {
    private static final Logger log = LogManager.getLogger(CoreTimer.class.getName()) ;
    private static final CoreTimer instance = new CoreTimer() ;
    private Long workInterval = 100L ;//核心线程暂停间隔
    private Timer timer;
    private boolean stop;
    private CoreTimer(){
        this.timer = new Timer();
        this.stop = false ;
    }
    public static CoreTimer getInstance(){
        return instance ;
    }
    public void stop(){
        this.stop = true ;
        if(this.timer != null){
            this.timer.cancel();
        }
    }
    public boolean isStop(){
        return this.stop ;
    }
    /**
     * è®¾ç½®/核心线程暂停间隔
     * @param workInterval /核心线程暂停间隔
     */
    public void setSleep(Long workInterval){
        this.workInterval = workInterval ;
    }
    public void start(){
        this.timer.schedule(this, 0 , this.workInterval);
    }
    /**
     * TimerTask的run方法
     */
    @Override
    public void run() {
        try{
            /**
             * æ­¤å¤„取出当前队列的节点数量,作为一个定量count处理,
             * åŽŸå› :
             * åœ¨å¤„理定量count过程中,可能有的节点又回到队列中,也可能新生节点进入队列中,即在处理过程中,队列可能又增长了
             */
            int count = CoreUnit.taskQueue.size() ;
            while(count > 0){
                CoreTask task = (CoreTask)CoreUnit.taskQueue.pop() ;
                if(task != null){
                    task.execute();
                }
                count-- ;
            }
        }catch(Exception e){
            log.error("核心线程发生异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e);;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreUnit.java
@@ -8,6 +8,7 @@
import com.dy.common.mw.UnitInterface;
import com.dy.common.mw.UnitCallbackInterface;
public class CoreUnit implements UnitInterface {
    
    private static final CoreUnit instance = new CoreUnit() ;
@@ -36,17 +37,14 @@
        if(vo == null){
            throw new Exception("核心模块配置对象不能为空!") ;
        }
        if(vo.sleepBigBusy == null || vo.sleepSmallBusy == null){
        if(vo.coreInterval == null){
            throw new Exception("核心模块配置对象间隔属性值不能为空!") ;
        }
        if(vo.sleepBigBusy <= 0){
            throw new Exception("核心模块配置对象属性sleepBigBusy值不能小于0!") ;
        if(vo.coreInterval <= 0){
            throw new Exception("核心模块配置对象属性coreInterval值不能小于0!") ;
        }
        if(vo.sleepBigBusy > 1000){
            throw new Exception("核心模块配置对象属性sleepBigBusy值不能大于1000!") ;
        }
        if(vo.sleepSmallBusy > 1000){
            throw new Exception("核心模块配置对象属性sleepSmallBusy值不能大于1000!") ;
        if(vo.coreInterval > 1000){
            throw new Exception("核心模块配置对象属性coreInterval值不能大于1000!") ;
        }
        if(vo.queueWarnSize == null || vo.queueMaxSize == null){
            throw new Exception("核心模块配置对象队列节点限制数量属性值不能为空!") ;
@@ -67,18 +65,22 @@
    public void start(UnitCallbackInterface callback) throws Exception {
        if(!started){
            started = true ;
            /*
            CoreThread ct = CoreThread.getInstance() ;
            ct.setSleep(this.adapter.getConfig().sleepBigBusy, this.adapter.getConfig().sleepSmallBusy);
            ct.start();
            ct.start();
            */
            CoreTimer ct = CoreTimer.getInstance() ;
            ct.setSleep(this.adapter.getConfig().coreInterval);
            ct.start();
            CoreConstantManage ccm = CoreConstantManage.getInstance() ;
            ccm.setSleep(this.adapter.getConfig().sleepBigBusy, this.adapter.getConfig().sleepSmallBusy);
            ccm.setSleep(this.adapter.getConfig().coreInterval);
            ccm.start();
            
            if(adapter.getConfig().showStartInfo){
                System.out.println("核心模块成功启动,"
                        + "主线程繁忙间隔:" + adapter.getConfig().sleepBigBusy + "毫秒,"
                        + "轻闲间隔:" + adapter.getConfig().sleepSmallBusy + "毫秒"  );
                        + "主线程执行间隔:" + adapter.getConfig().coreInterval + "毫秒");
            }
            callback.call(null);
        }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/core/CoreUnitConfigVo.java
@@ -1,8 +1,7 @@
package com.dy.common.mw.core;
public class CoreUnitConfigVo {
    public Long sleepBigBusy = 100L ;//大忙时(除了恒久任务,还有其他任务需处理),核心线程暂停间隔
    public Long sleepSmallBusy = 500L ;//小忙时(只有恒久任务,无其他任务需处理),核心线程暂停间隔
    public Long coreInterval = 100L ;//大忙时(除了恒久任务,还有其他任务需处理),核心线程暂停间隔
    public Integer queueWarnSize = 1000 ;//队列报警长度
    public Integer queueMaxSize = 5000 ;//队列最大长度
    public Boolean showStartInfo; //是否在控制台上显示信息
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ThreadJob.java
@@ -2,6 +2,7 @@
@SuppressWarnings("unused")
@Deprecated
public abstract class ThreadJob {
    protected Thread thread ;
    protected boolean stop = false ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/TimerTaskJob.java
@@ -7,11 +7,12 @@
 * @Author: liurunyu
 * @Date: 2024/11/20 17:49
 * @Description :
 * 2024-11-20:
 * æ­¤æŠ½è±¡ç±»ä»£æ›¿ThreadJob,原因:
 * åœ¨while(true){}中使用Thread.sleep(),可能导致的严重性能问题,不推荐在循环中使用线程休眠。
 * Java线程实现采用内核线程实现,线程的休眠及唤醒(状态切换)需借助操作系统进行,这是一个极其耗时耗力的操作。
 * åœ¨çº¿ç¨‹ä¼‘眠或运行时间较长的情景下,其对性能的影响还不算明显,因为对线程状态的切换并不频繁。
 * ä½†è‹¥çº¿ç¨‹ä¼‘眠及运行的时间都很短(例如毫秒/秒,文中案例就是一个典型案例),
 * ä½†è‹¥çº¿ç¨‹ä¼‘眠及运行的时间都很短(例如毫秒/秒),
 * ç³»ç»Ÿå°†é¢‘繁的对线程状态进行切换,导致严重的性能损耗,并对着循环次数的递增而放大。
 */
public abstract class TimerTaskJob {
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voUg/VoUgRtuResult.java
New file
@@ -0,0 +1,30 @@
package com.dy.pipIrrGlobal.voUg;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;
import lombok.Data;
/**
 * @Author: liurunyu
 * @Date: 2024/11/22 14:26
 * @Description
 */
@Data
@HeadRowHeight(26)
@ContentRowHeight(22)
public class VoUgRtuResult {
    @ExcelProperty("控制器地址")
    @ColumnWidth(20)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    public String rtuAddr;
    @ExcelProperty("升级结果")
    @ColumnWidth(30)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER)
    public String result;
}
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -313,7 +313,7 @@
    #命令发送地址(中缀是机构tag,其也是数据源后缀名称)
    ym:
        comSendUrl: "http://127.0.0.1:8070/rtuMw/com/send"
        ugTaskSendUrl: "http://192.168.40.132:8070/rtuMw/com/upgradeRtu"
        ugTaskSendUrl: "http://127.0.0.1:8070/rtuMw/com/upgradeRtu"
        rtuLogFileUrl: "http://127.0.0.1:8070/rtuMw/com/rtuLogFile"
        rtuLogTextUrl: "http://127.0.0.1:8070/rtuMw/com/rtuLogText"
    sp:
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
@@ -370,8 +370,7 @@
            // ///////////////
            // æ ¸å¿ƒ
            CoreUnitConfigVo coreConfVo = new CoreUnitConfigVo();
            coreConfVo.sleepBigBusy = conf.getSetAttrPlusInt(doc, "config.core", "sleepBigBusy", null, 1, 200, null).longValue() ;
            coreConfVo.sleepSmallBusy = conf.getSetAttrPlusInt(doc, "config.core", "sleepSmallBusy", null, 2, 1000, null).longValue();
            coreConfVo.coreInterval = conf.getSetAttrPlusInt(doc, "config.core", "coreInterval", null, 1, 200, null).longValue() ;
            coreConfVo.queueWarnSize = ServerProperties.cacheUpDownDataWarnCount ;
            coreConfVo.queueMaxSize = ServerProperties.cacheUpDownDataMaxCount ;
            coreConfVo.showStartInfo = showStartInfo ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java
@@ -13,6 +13,7 @@
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
/**
 * @Author: liurunyu
@@ -202,6 +203,7 @@
        if(this.taskVo.rtuAddrList != null && this.taskVo.rtuAddrList.size() > 0){
            state.rtuTotal = this.taskVo.rtuAddrList.size() ;
            if(this.upgradeRtus != null && this.upgradeRtus.size() > 0){
                AtomicBoolean hasRunning = new AtomicBoolean(false);
                this.upgradeRtus.values().stream().forEach(info ->{
                    if(info.state == UpgradeRtu.STATE_OFFLINE){
                        state.offLineTotal ++ ;
@@ -222,8 +224,15 @@
                    }
                    if(info.isOver){
                        state.overTotal++;
                    }else{
                        hasRunning.set(true);
                    }
                });
                if(!hasRunning.get()){
                    state.allOver = true ;
                }else{
                    state.allOver = false ;
                }
            }
        }
        return state ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(spɳÅÌ).xml
@@ -124,14 +124,12 @@
    />
    <!--
    sleepBigBusy:主线程大忙时每次执行间隔时长(毫秒)
    sleepSmallBusy:主线程小忙时每次执行间隔时长(毫秒)
    coreInterval:主线程每次执行间隔时长(毫秒)
    queueWarnSize: ç¼“存队列节点数警告数量
    queueMaxSize: ç¼“存队列节点数最大数量
     -->
    <core
            sleepBigBusy="100"
            sleepSmallBusy="500"
            coreInterval="100"
            queueWarnSize="100000"
            queueMaxSize="300000"
    />
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(test²âÊÔ).xml
@@ -124,14 +124,12 @@
    />
    <!--
    sleepBigBusy:主线程大忙时每次执行间隔时长(毫秒)
    sleepSmallBusy:主线程小忙时每次执行间隔时长(毫秒)
    coreInterval:主线程每次执行间隔时长(毫秒)
    queueWarnSize: ç¼“存队列节点数警告数量
    queueMaxSize: ç¼“存队列节点数最大数量
     -->
    <core
            sleepBigBusy="100"
            sleepSmallBusy="500"
            coreInterval="100"
            queueWarnSize="100000"
            queueMaxSize="300000"
    />
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(ymԪı).xml
@@ -124,14 +124,12 @@
    />
    <!--
    sleepBigBusy:主线程大忙时每次执行间隔时长(毫秒)
    sleepSmallBusy:主线程小忙时每次执行间隔时长(毫秒)
    coreInterval:主线程每次执行间隔时长(毫秒)
    queueWarnSize: ç¼“存队列节点数警告数量
    queueMaxSize: ç¼“存队列节点数最大数量
     -->
    <core
            sleepBigBusy="100"
            sleepSmallBusy="500"
            coreInterval="100"
            queueWarnSize="100000"
            queueMaxSize="300000"
    />
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
@@ -124,14 +124,12 @@
    />
    <!--
    sleepBigBusy:主线程大忙时每次执行间隔时长(毫秒)
    sleepSmallBusy:主线程小忙时每次执行间隔时长(毫秒)
    coreInterval:主线程每次执行间隔时长(毫秒)
    queueWarnSize: ç¼“存队列节点数警告数量
    queueMaxSize: ç¼“存队列节点数最大数量
     -->
    <core
            sleepBigBusy="100"
            sleepSmallBusy="500"
            coreInterval="100"
            queueWarnSize="100000"
            queueMaxSize="300000"
    />
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java
@@ -132,7 +132,7 @@
                    jsonArray.add(jsonObject);
                });
            }
            System.out.println(jsonArray);
            //System.out.println(jsonArray);
        }
        /**
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java
@@ -1,7 +1,8 @@
package com.dy.pipIrrRemote.rtuUpgrage;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.dy.common.aop.SsoAop;
import com.dy.common.multiDataSource.DataSourceContext;
import com.dy.common.softUpgrade.state.UpgradeRtu;
import com.dy.common.softUpgrade.state.UpgradeTaskVo;
import com.dy.common.springUtil.SpringContextUtil;
@@ -12,6 +13,8 @@
import com.dy.pipIrrGlobal.pojoUg.UgRtuProgram;
import com.dy.pipIrrGlobal.pojoUg.UgRtuTask;
import com.dy.pipIrrGlobal.rtuMw.ToRtuMwCom;
import com.dy.pipIrrGlobal.voPr.VoDivide;
import com.dy.pipIrrGlobal.voUg.VoUgRtuResult;
import com.dy.pipIrrGlobal.voUg.VoWatch;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
@@ -19,15 +22,19 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
@@ -44,6 +51,9 @@
public class RtuUpgradeCtrl extends ToRtuMwCom {
    @Autowired
    private RtuUpgradeSv sv ;
    @Autowired
    RtuUpgradeResSv resSv ;
    @Autowired
    private Environment env;
@@ -128,9 +138,10 @@
        vo.softBytesCalculate = ppo.programCalculateBytes ;
        vo.softByteSrc16 = ppo.programCrc16 ;
    }
    /**
     *  ç›‘视:
     * é‡ç½®ï¼Œæ¼”示的重置
     * é‡ç½®è¿œç¨‹å‡çº§æ¼”示程序
     * @return æ“ä½œç»“æžœ
     */
    @GetMapping(path = "/demoReset")
@@ -166,7 +177,7 @@
        if(qvo == null){
            qvo = new QueryVo();
            qvo.pageCurr = 1 ;
            qvo.pageSize = 50 ;
            qvo.pageSize = 49 ;
        }
        if(RtuUpgradeStateReceiverCtrl.cache == null){
            //return BaseResponseUtils.buildError("当前没有升级任务") ;
@@ -174,96 +185,50 @@
            RtuUpgradeStateReceiverCtrl ctrl = SpringContextUtil.getBean(RtuUpgradeStateReceiverCtrl.class);
            ctrl.demo();
        }
        QueryResultVo<VoWatch> rsVo = new QueryResultVo();
        VoWatch vo = new VoWatch() ;
        List<UpgradeRtu> listFiltered = null ;
        if(RtuUpgradeStateReceiverCtrl.cache != null && RtuUpgradeStateReceiverCtrl.cache.ugTaskId != null){
            vo.upgrade = this.sv.selectTaskDetail(RtuUpgradeStateReceiverCtrl.cache.ugTaskId);
            vo.overall = RtuUpgradeStateReceiverCtrl.cache.ugOverallState ;
            vo.rtus = new ArrayList<>() ;
            if(RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList != null && RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.size() > 0) {
                listFiltered = filterByQuery(qvo) ;
                if (listFiltered.size() > 0) {
                    if(qvo.pageCurr < 1){
                        qvo.pageCurr = 1 ;
                    }
                    int start = (qvo.pageCurr - 1) * qvo.pageSize ;
                    if(start >= listFiltered.size()){
                        if(listFiltered.size()%qvo.pageSize > 0){
                            start = listFiltered.size() - listFiltered.size()%qvo.pageSize ;
                        }else{
                            start = listFiltered.size() - qvo.pageSize ;
                        }
                    }
                    for(int i = start; i < (start + qvo.pageSize) && i < listFiltered.size(); i++){
                        UpgradeRtu ugRtu = listFiltered.get(i) ;
                        VoWatch.VoWatchRtu rtu = new VoWatch.VoWatchRtu() ;
                        rtu.fromCache(ugRtu) ;
                        vo.rtus.add(rtu) ;
                    }
                }
            }
        }
        rsVo.obj = vo ;
        rsVo.pageSize = qvo.pageSize ;
        rsVo.pageCurr = qvo.pageCurr ;
        rsVo.calculateAndSet(0L + (listFiltered==null?0:listFiltered.size()), null);
        QueryResultVo<VoWatch> rsVo = this.resSv.curUpgradeState(qvo) ;
        return BaseResponseUtils.buildSuccess(rsVo) ;
    }
    private List<UpgradeRtu> filterByQuery(QueryVo qvo){
        if (qvo.status != null || qvo.result != null) {
            final Integer qvoStatus = qvo.status ;
            final Integer qvoResult = qvo.result ;
            final String qvoRtuAddr = qvo.rtuAddr ;
            return RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.stream().filter(rtu -> {
                boolean ok = false;
                if (qvoStatus != null) {
                    if (qvoStatus.intValue() == 1) {
                        if (rtu.state == UpgradeRtu.STATE_RUNNING) {
                            ok = true;
                        }else{
                            ok = false ;
                        }
                    } else if (qvoStatus.intValue() == 0) {
                        if (rtu.isOver) {
                            ok = true;
                        }else{
                            ok = false ;
                        }
                    }
                }
                if (qvoResult != null) {
                    if (qvoResult.intValue() == 1) {
                        if (rtu.state == UpgradeRtu.STATE_SUCCESS) {
                            ok = true;
                        }else{
                            ok = false ;
                        }
                    } else if (qvoResult.intValue() == 0) {
                        if (rtu.state == UpgradeRtu.STATE_OFFLINE
                                || rtu.state == UpgradeRtu.STATE_FAILONE
                                || rtu.state == UpgradeRtu.STATE_FAIL
                                || rtu.state == UpgradeRtu.STATE_FAILOFFLINE) {
                            ok = true;
                        }else{
                            ok = false ;
                        }
                    }
                }
                if(qvoRtuAddr != null && !qvoRtuAddr.trim().equals("")){
                    if(rtu.rtuAddr.equals(qvoRtuAddr)){
                        ok = true;
                    }else{
                        ok = false ;
                    }
                }
                return ok;
            }).toList() ;
        }else{
            return RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList ;
        }
    /**
     * å¯¼å‡ºå‡çº§å¤±è´¥RTU列表
     * @param response
     */
    @RequestMapping(value = "/exportUgFail", method = RequestMethod.GET)
    public void exportUgFail(HttpServletResponse response) throws Exception {
        setExcelRespProp(response, "升级失败RTU列表");
        List<VoUgRtuResult> rsList = resSv.exportUgFail();
        EasyExcel.write(response.getOutputStream())
                .head(VoUgRtuResult.class)
                .excelType(ExcelTypeEnum.XLSX)
                .sheet("升级失败RTU列表")
                .doWrite(rsList);
    }
    /**
     * å¯¼å‡ºé•¿çº§æˆåŠŸRTU列表
     * @param response
     */
    @RequestMapping(value = "/exportUgSuccess", method = RequestMethod.GET)
    public void exportUgSuccess(HttpServletResponse response) throws Exception {
        setExcelRespProp(response, "升级成功RTU列表");
        List<VoUgRtuResult> rsList = resSv.exportUgSuccess();
        EasyExcel.write(response.getOutputStream())
                .head(VoUgRtuResult.class)
                .excelType(ExcelTypeEnum.XLSX)
                .sheet("升级成功RTU列表")
                .doWrite(rsList);
    }
    /**
     * è®¾ç½®excel下载响应头属性
     */
    private void setExcelRespProp(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode(rawFileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeResSv.java
New file
@@ -0,0 +1,160 @@
package com.dy.pipIrrRemote.rtuUpgrage;
import com.dy.common.softUpgrade.state.UpgradeRtu;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.voUg.VoUgRtuResult;
import com.dy.pipIrrGlobal.voUg.VoWatch;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author liurunyu
 * @Date 2024/11/22 14:40
 * @Description
 */
@Slf4j
@Service
public class RtuUpgradeResSv {
    @Autowired
    private RtuUpgradeSv sv ;
    public QueryResultVo<VoWatch> curUpgradeState(QueryVo qvo){
        QueryResultVo<VoWatch> rsVo = new QueryResultVo<>();
        VoWatch vo = new VoWatch() ;
        List<UpgradeRtu> listFiltered = null ;
        if(RtuUpgradeStateReceiverCtrl.cache != null && RtuUpgradeStateReceiverCtrl.cache.ugTaskId != null){
            vo.upgrade = this.sv.selectTaskDetail(RtuUpgradeStateReceiverCtrl.cache.ugTaskId);
            vo.overall = RtuUpgradeStateReceiverCtrl.cache.ugOverallState ;
            vo.rtus = new ArrayList<>() ;
            if(RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList != null && RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.size() > 0) {
                listFiltered = filterByQuery(qvo) ;
                if (listFiltered.size() > 0) {
                    if(qvo.pageCurr < 1){
                        qvo.pageCurr = 1 ;
                    }
                    int start = (qvo.pageCurr - 1) * qvo.pageSize ;
                    if(start >= listFiltered.size()){
                        if(listFiltered.size()%qvo.pageSize > 0){
                            start = listFiltered.size() - listFiltered.size()%qvo.pageSize ;
                        }else{
                            start = listFiltered.size() - qvo.pageSize ;
                        }
                    }
                    for(int i = start; i < (start + qvo.pageSize) && i < listFiltered.size(); i++){
                        UpgradeRtu ugRtu = listFiltered.get(i) ;
                        VoWatch.VoWatchRtu rtu = new VoWatch.VoWatchRtu() ;
                        rtu.fromCache(ugRtu) ;
                        vo.rtus.add(rtu) ;
                    }
                }
            }
        }
        rsVo.obj = vo ;
        rsVo.pageSize = qvo.pageSize ;
        rsVo.pageCurr = qvo.pageCurr ;
        rsVo.calculateAndSet((long)(listFiltered==null?0:listFiltered.size()), null);
        return rsVo ;
    }
    /**
     * è¿‡æ»¤ç»“æžœ
     * @param qvo æŸ¥è¯¢å‚æ•°
     * @return é›†åˆ
     */
    private List<UpgradeRtu> filterByQuery(QueryVo qvo){
        if (qvo.status != null || qvo.result != null) {
            Integer qvoStatus = qvo.status ;
            Integer qvoResult = qvo.result ;
            String qvoRtuAddr = qvo.rtuAddr ;
            return RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.stream().filter(rtu -> {
                boolean ok = false;
                if (qvoStatus != null) {
                    if (qvoStatus == 1) {
                        ok = rtu.state == UpgradeRtu.STATE_RUNNING;
                    } else if (qvoStatus == 0) {
                        ok = rtu.isOver;
                    }
                }
                if (qvoResult != null) {
                    if (qvoResult == 1) {
                        ok = rtu.state == UpgradeRtu.STATE_SUCCESS;
                    } else if (qvoResult == 0) {
                        ok = rtu.state == UpgradeRtu.STATE_OFFLINE
                                || rtu.state == UpgradeRtu.STATE_FAILONE
                                || rtu.state == UpgradeRtu.STATE_FAIL
                                || rtu.state == UpgradeRtu.STATE_FAILOFFLINE;
                    }
                }
                if(qvoRtuAddr != null && !qvoRtuAddr.trim().equals("")){
                    ok = rtu.rtuAddr.equals(qvoRtuAddr);
                }
                return ok;
            }).toList() ;
        }else{
            return RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList ;
        }
    }
    /**
     * è¿‡æ»¤å‡ºå½“前长级任务中升级失败的RTU
     * @return é›†åˆ
     */
    public List<VoUgRtuResult> exportUgFail(){
        List<VoUgRtuResult> list = new ArrayList<>() ;
        if(RtuUpgradeStateReceiverCtrl.cache != null && RtuUpgradeStateReceiverCtrl.cache.ugTaskId != null){
            if(RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList != null && RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.size() > 0) {
                RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.forEach(rtu -> {
                    if(rtu.isOver){
                        if(rtu.state == UpgradeRtu.STATE_OFFLINE
                                || rtu.state == UpgradeRtu.STATE_UNSTART
                                || rtu.state == UpgradeRtu.STATE_FAILOFFLINE){
                            VoUgRtuResult vo = new VoUgRtuResult() ;
                            vo.rtuAddr = rtu.rtuAddr ;
                            vo.result = "离线" ;
                            list.add(vo);
                        }else if(rtu.state == UpgradeRtu.STATE_FAILONE){
                            VoUgRtuResult vo = new VoUgRtuResult() ;
                            vo.rtuAddr = rtu.rtuAddr ;
                            vo.result = "一包死" ;
                            list.add(vo);
                        }else if(rtu.state == UpgradeRtu.STATE_FAIL){
                            VoUgRtuResult vo = new VoUgRtuResult() ;
                            vo.rtuAddr = rtu.rtuAddr ;
                            vo.result = "多包死" ;
                            list.add(vo);
                        }
                    }
                });
            }
        }
        return list ;
    }
    /**
     * è¿‡æ»¤å‡ºå½“前长级任务中升级成功的RTU
     * @return é›†åˆ
     */
    public List<VoUgRtuResult> exportUgSuccess(){
        List<VoUgRtuResult> list = new ArrayList<>() ;
        if(RtuUpgradeStateReceiverCtrl.cache != null && RtuUpgradeStateReceiverCtrl.cache.ugTaskId != null){
            if(RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList != null && RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.size() > 0) {
                RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList.forEach(rtu -> {
                    if(rtu.isOver){
                        if(rtu.state == UpgradeRtu.STATE_SUCCESS){
                            VoUgRtuResult vo = new VoUgRtuResult() ;
                            vo.rtuAddr = rtu.rtuAddr ;
                            vo.result = "升级成功" ;
                            list.add(vo);
                        }
                    }
                });
            }
        }
        return list ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java
@@ -244,7 +244,7 @@
        }
        int n = Integer.parseInt(new CreateRandom().create(3)) ;
        if(n == 540 || n == 541 || n == 542 || n == 543 || n == 544 || n == 545){
        if(n == 540 || n == 541 || n == 542 || n == 543 || n == 544 || n == 545 || n == 546 || n == 547 || n == 548 || n == 549 ){
            if(rtu.currentPackage == 1){
                //1包死
                rtu.state = UpgradeRtu.STATE_FAILONE ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java
@@ -58,28 +58,6 @@
    }
    /**
     * æŸ¥è¯¢ä¸€ä¸ªå‡çº§ä»»åŠ¡æœ‰å…³ä¿¡æ¯
     * @return å‡çº§ä»»åŠ¡æœ‰å…³ä¿¡æ¯
     */
    public VoUpgradeDetail selectTaskDetail(String taskId){
        List<VoUpgradeDetail> list = this.tdao.selectTaskDetail(Long.valueOf(taskId)) ;
        if(list != null && list.size() > 0){
            return list.get(0) ;
        }
        return null ;
    }
    /**
     * ä¿å­˜å‡çº§ä»»åŠ¡ä¸ºæ‰§è¡ŒçŠ¶æ€
     * @param taskId ä»»åŠ¡ID
     */
    public void setUpgradeTaskExecuted(String taskId){
        this.tdao.executeById(Long.valueOf(taskId)) ;
    }
    /**
     * ä¿å­˜RTU升级结束状态
     * @param taskId
     * @param rtu
@@ -91,17 +69,38 @@
        cdao.updateRtuUpgradeState(params) ;
    }
    /////////////////////////////////////////////////////
    //
    // ä»¥ä¸‹æ¨¡æ‹Ÿæ•°æ®
    //
    /////////////////////////////////////////////////////
    /**
     * é€šä¿¡ä¸»é”®æŸ¥è¯¢ä¸€ä¸ªå‡çº§ä»»åŠ¡
     * æŸ¥è¯¢ä¸€ä¸ªå‡çº§ä»»åŠ¡æœ‰å…³ä¿¡æ¯
     * @return å‡çº§ä»»åŠ¡æœ‰å…³ä¿¡æ¯
     */
    public VoUpgradeDetail selectTaskDetail(String taskId){
        List<VoUpgradeDetail> list = this.tdao.selectTaskDetail(Long.valueOf(taskId)) ;
        if(list != null && list.size() > 0){
            return list.get(0) ;
        }
        return null ;
    }
    /**
     * ä¿å­˜å‡çº§ä»»åŠ¡ä¸ºæ‰§è¡ŒçŠ¶æ€
     * @param taskId ä»»åŠ¡ID
     */
    public void setUpgradeTaskExecuted(String taskId){
        this.tdao.executeById(Long.valueOf(taskId)) ;
    }
    /////////////////////////////////////////////////////
    //
    // ä»¥ä¸‹æ¼”示升级功能用到
    //
    /////////////////////////////////////////////////////
    /**
     * æŸ¥è¯¢æœ€æ–°ä¸€ä¸ªå‡çº§ä»»åŠ¡
     * @return
     */
    public UgRtuTask selectLastTask(){
        return tdao.selectLastTask();
    }
}
pipIrr-platform/pom.xml
@@ -271,11 +271,11 @@
                <scope>import</scope>
            </dependency>
            <!-- quartz -->
            <!-- rocketmq-client -->
            <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-client</artifactId>
                <version>4.9.7</version>
                <version>5.3.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>