| | |
| | | |
| | | private static final UpgradeManager INSTANCE = new UpgradeManager(); |
| | | |
| | | private Boolean openNoUpgrade ;//阀开(泵开)不执行升级 |
| | | private Integer lastOpenMaxGoOn ;//阀开(泵开)状态设置以来持续最长时间(秒钟),超过这个时间认为状态无效(这个时长取决于工作报间隔) |
| | | private Integer failTryTimes ;//升级失败后,重新偿试升级次数,0表示不重新偿试升级 |
| | | private Integer ugMaxRtuSameTime ;//同时升级RTU最大个数 |
| | | private Integer notifyTimesAfterOver; //升级结束后,再向web服务系统通知状态的次数 |
| | | private int nowNotifyTimesAfterOver; //升级结束后,再向web服务系统通知状态的次数 |
| | | |
| | | private UpgradeTask task ;//升级任务 |
| | | private boolean monitorFirst = true ;//是否是第一次监视 |
| | | private boolean monitorFirst ;//是否是第一次监视 |
| | | |
| | | private UpgradeManager(){ |
| | | monitorFirst = true ; |
| | |
| | | * 初始化配置信息 |
| | | */ |
| | | public void initOption(UpgradeUnitConfigVo configVo) { |
| | | this.openNoUpgrade = configVo.openNoUpgrade; |
| | | this.lastOpenMaxGoOn = configVo.lastOpenMaxGoOn; |
| | | this.failTryTimes = configVo.failTryTimes; |
| | | this.ugMaxRtuSameTime = configVo.ugMaxRtuAtOnce; |
| | | this.notifyTimesAfterOver = configVo.notifyTimesAfterOver; |
| | | } |
| | | |
| | | /** |
| | |
| | | this.task.forceOver(); |
| | | } |
| | | this.task = new UpgradeTask(); |
| | | this.task.initOption(this.failTryTimes, this.ugMaxRtuSameTime); |
| | | this.task.initOption(this.openNoUpgrade, this.lastOpenMaxGoOn, this.failTryTimes, this.ugMaxRtuSameTime); |
| | | this.task.setTask(vo); |
| | | log.error("==================================================") ; |
| | | log.error("= =") ; |
| | | log.error("=当前设置了升级任务,其中RTU有" + vo.rtuAddrList.size() + "个 =") ; |
| | | log.error("= =") ; |
| | | log.error("==================================================") ; |
| | | this.nowNotifyTimesAfterOver = 0 ; |
| | | this.monitorFirst = true ; |
| | | log.info("======================================================") ; |
| | | log.info("= =") ; |
| | | log.info("=设置了升级任务,涉及RTU" + vo.rtuAddrList.size() + "台 =") ; |
| | | log.info("= =") ; |
| | | log.info("======================================================") ; |
| | | }catch (Exception e){ |
| | | ex = e ; |
| | | }finally { |
| | |
| | | * 因为强制结束升级任务,对一个未升级完成的RTU就会卡死, |
| | | * 所以当强制结束升级任务,代码逻辑并没有强制结果RTU升级过程,如果升级过程也强制停止,那么RTU真会卡死 |
| | | */ |
| | | public void forceOverUpgradeTask() { |
| | | public String forceOverUpgradeTask() { |
| | | if(this.task != null){ |
| | | this.stop(); |
| | | this.task.forceOver(); |
| | | this.task.countRunningRtuCount(); |
| | | if(this.task.curUgRunningRtuTotal > 0){ |
| | | return "当前存在升级中的设备,不能结束升级任务" ; |
| | | }else{ |
| | | this.stop(); |
| | | this.task.forceOver(); |
| | | return null ; |
| | | } |
| | | }else{ |
| | | return "当前没有升级任务" ; |
| | | } |
| | | this.task = null ; |
| | | } |
| | | |
| | | /** |
| | |
| | | this.stop() ; |
| | | }else{ |
| | | if(!this.task.taskIsOver){ |
| | | if(this.openNoUpgrade != null |
| | | && this.openNoUpgrade.booleanValue() |
| | | && this.monitorFirst){ |
| | | //第一次进入,进行阀开不升级处理 |
| | | this.task.openNoUpgrade() ; |
| | | } |
| | | this.nowNotifyTimesAfterOver = 0 ; |
| | | //升级任务未完成 |
| | | //工作1:判断是否无任何一个RTU进行过升级,并且达到时限,则认为当前升级任务完成 |
| | | //-1:无一RTU升级且超时,0:无RTU升级但未超时等待,1有RTU升级正常执行 |
| | |
| | | int temp = this.task.countNoOneRtuUpgradeInDuration() ; |
| | | if(temp == -1){ |
| | | //当前没有RTU进行过升级,而且超时了,认为任务已经完成 |
| | | log.error("==================================================") ; |
| | | log.error("= =") ; |
| | | log.error("=当前没有RTU进行过升级,而且超时了,认为任务已经完成 =") ; |
| | | log.error("= =") ; |
| | | log.error("==================================================") ; |
| | | this.task.taskIsOver = true ; |
| | | this.stop(); |
| | | log.info("===========================================================") ; |
| | | log.info("= =") ; |
| | | log.info("=无RTU升级超时,因无一台RTU进行升级,并且等待超时,强制设置升级完成 =") ; |
| | | log.info("= =") ; |
| | | log.info("===========================================================") ; |
| | | }else if(temp == 1){ |
| | | //当前有RTU进行过升级 |
| | | //工作2:统计当前正在升级的RTU数量,为同时升级数量限制做准备 |
| | | this.task.countRunningRtuCount() ; |
| | | temp = this.task.countRunningRtuCount() ; |
| | | if(temp > 0){ |
| | | //说前当前还有升级中的RTU |
| | | } |
| | | |
| | | //工作3:统计需要升级但当前离线RTU的情况,超过时限的设置为升级完成 |
| | | int tmp = this.task.countOffRtuAndSetIfOver() ; |
| | | if(tmp >= 1){ |
| | | //超时,强制设置一些RTU升级失败并且升级完成) |
| | | log.error("==================================================") ; |
| | | log.error("= =") ; |
| | | log.error("=超时,强制设置" + tmp + "个RTU升级失败并且升级完成 =") ; |
| | | log.error("= =") ; |
| | | log.error("==================================================") ; |
| | | //超时,强制设置一些RTU升级失败并且升级完成 |
| | | log.info("======================================================") ; |
| | | log.info("= =") ; |
| | | log.info("=因离线超时,强制设置" + tmp + "台RTU升级失败并且升级完成 =") ; |
| | | log.info("= =") ; |
| | | log.info("======================================================") ; |
| | | }else if(tmp == 0){ |
| | | log.error("==================================================") ; |
| | | log.error("= =") ; |
| | | log.error("=超时,强制设置0个RTU升级失败并且升级完成 =") ; |
| | | log.error("= =") ; |
| | | log.error("==================================================") ; |
| | | /* |
| | | log.info("======================================================") ; |
| | | log.info("= =") ; |
| | | log.info("=离线超时,但无一台RTU因离线而被设置成升级失败并且升级完成 =") ; |
| | | log.info("= =") ; |
| | | log.info("======================================================") ; |
| | | */ |
| | | }else{//tmp = -1 |
| | | //无任务逻辑 |
| | | } |
| | | //工作4:统计是否全部升级完成 |
| | | |
| | | //工作4:统计进行升级过程而后又停止升级,发呆一定时长的设备 |
| | | tmp = this.task.countRunningIdleRtuAndSetIfOver() ; |
| | | if(tmp >= 1){ |
| | | //升级发呆超时,强制设置一些RTU升级失败并且升级完成 |
| | | log.info("======================================================") ; |
| | | log.info("= =") ; |
| | | log.info("=因升级发呆超时,强制设置" + tmp + "台RTU升级失败并且升级完成 =") ; |
| | | log.info("= =") ; |
| | | log.info("======================================================") ; |
| | | } |
| | | |
| | | //工作5:统计是否全部升级完成 |
| | | this.task.taskIsOver = this.task.countIsAllOver() ; |
| | | if(this.task.taskIsOver){ |
| | | log.error("==================================================") ; |
| | | log.error("= =") ; |
| | | log.error("=升级全部结束,设置升级任务完成 =") ; |
| | | log.error("= =") ; |
| | | log.error("==================================================") ; |
| | | log.info("==================================================") ; |
| | | log.info("= =") ; |
| | | log.info("= 升级全部结束,设置升级任务完成,涉及RTU" + this.task.taskVo.rtuAddrList.size() + "台 =") ; |
| | | log.info("= =") ; |
| | | log.info("==================================================") ; |
| | | } |
| | | }else if(temp == 0){ |
| | | //当前没有一个RTU进行过升级,也没有超时,不作为 |
| | |
| | | this.task.taskOverDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;//任务完成时间(yyyy-mm-dd HH:MM:SS) |
| | | } |
| | | //任务完成,执行最后一次升级状态通知 |
| | | //工作5:升级状态通知 |
| | | //工作6:升级状态通知 |
| | | //if(!first){ |
| | | // this.notifyUpgradeStatus() ; |
| | | //} |
| | | }else{ |
| | | //任务未完成,继续执行升级状态通知 |
| | | //工作5: 升级状态通知 |
| | | //工作6: 升级状态通知 |
| | | //if(!first){ |
| | | // this.notifyUpgradeStatus() ; |
| | | //} |
| | | } |
| | | //工作5:升级状态通知 |
| | | //工作6:升级状态通知 |
| | | if(!this.monitorFirst){ |
| | | this.notifyUpgradeStatus() ; |
| | | } |
| | | }else{ |
| | | //任务已经完成 |
| | | this.stop(); |
| | | //工作6:任务结束后,最后发升级状态通知 |
| | | if(this.nowNotifyTimesAfterOver == 0){ |
| | | this.nowNotifyTimesAfterOver++ ; |
| | | this.notifyUpgradeStatus() ;//必须通知一次 |
| | | }else{ |
| | | //然后重复通知 |
| | | if(this.nowNotifyTimesAfterOver <= this.notifyTimesAfterOver){ |
| | | //保证上面必须通知一次,那此处上面if中就得用<= |
| | | this.nowNotifyTimesAfterOver++ ; |
| | | this.notifyUpgradeStatus() ; |
| | | }else{ |
| | | this.stop(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | if(this.monitorFirst){ |
| | |
| | | return true ; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 升级状态通知 |
| | | */ |