package com.dy.rtuMw.server.forTcp; import com.dy.rtuMw.server.rtuData.RtuComResultCache; import com.dy.rtuMw.server.rtuData.RtuComResultNode; import com.dy.rtuMw.server.rtuData.RtuDataNode; import com.dy.rtuMw.server.rtuData.RtuDataCache; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.dy.common.mw.protocol.MidResult; import com.dy.common.mw.protocol.MidResultAction; import com.dy.common.mw.protocol.MidResultFromRtu; import com.dy.common.mw.protocol.MidResultToRtu; public class MidResultActionFromRtu implements MidResultAction { private static Logger log = LogManager.getLogger(MidResultActionFromRtu.class) ; @Override public void doAction(MidResult result) { if(result != null && result instanceof MidResultFromRtu){ //如果此处需要更多的逻辑处理,可以生成一个任务类(实现CoreTask)对象进行处理 //当前,处理直接进行 MidResultFromRtu resFromRtu = (MidResultFromRtu)result ; if(!resFromRtu.reportOrResponse_trueOrFalse){ //命令应答 //此处实现,与以前不一样, //以前实现:匹配命令是从后向前匹配, //当前实现,匹配命令是从前向后匹配,原因:举例,当批量下发补召命令,如果从后匹配,则前面命令会下发多次,即一个上报次数据会补召多次 MidResultToRtu resToRtu = TcpDownCommandCache.matchFromHead(resFromRtu) ; if(resToRtu != null){ //匹配到下发的命令 resFromRtu.matchedCommand(resToRtu.rtuResultSendWebUrl, resToRtu.commandId) ; this.nextDealRtuData(false, resFromRtu); this.nextDealRtuComResult(resFromRtu); }else{ this.nextDealRtuData(false, resFromRtu); //未匹配到下发的命令,命令在缓存因超时被清除了 RtuStatusDealer.commandFail2Success(resFromRtu.rtuAddr) ; } }else{ //主动上报数据 this.nextDealRtuData(true, resFromRtu); } } } /** * 进入多线程环境中运行 * @param reportOrResponse_trueOrFalse * @param resFromRtu */ private void nextDealRtuData(boolean reportOrResponse_trueOrFalse, MidResultFromRtu resFromRtu){ try{ RtuDataCache.cacheRtuUpData(reportOrResponse_trueOrFalse, new RtuDataNode(resFromRtu.data)); }catch(Exception e){ log.error(e.getMessage(), e); } } /** * 进入单线程环境中运行 * @param resFromRtu */ private void nextDealRtuComResult(MidResultFromRtu resFromRtu){ try{ RtuComResultCache.cacheRtuComResult(new RtuComResultNode(resFromRtu.data)); }catch(Exception e){ log.error(e.getMessage(), e); } } }