package com.dy.aceMw.server.forTcp;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import com.dy.aceMw.server.forMq.ToMqMessageCach;
|
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;
|
import com.dy.common.util.rtuMq.MessageType;
|
|
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 = TcpDownCommandCach.matchFromHead(resFromRtu) ;
|
if(resToRtu != null){
|
//匹配到下发的命令
|
resFromRtu.setCommandId(resToRtu.commandId) ;
|
this.sendResult(false, resFromRtu);
|
}else{
|
this.sendResult(false, resFromRtu);
|
//未匹配到下发的命令,命令在缓存因超时被清除了
|
RtuStatusDealer.commandFail2Success(resFromRtu.rtuAddr) ;
|
}
|
}else{
|
//主动上报数据
|
this.sendResult(true, resFromRtu);
|
}
|
}
|
}
|
private void sendResult(boolean reportOrResponse_trueOrFalse, MidResultFromRtu resFromRtu){
|
try{
|
String json = resFromRtu.data.toJson() ;
|
if(reportOrResponse_trueOrFalse){
|
ToMqMessageCach.cachObj(MessageType.RtuAutoReport, json);
|
}else{
|
ToMqMessageCach.cachObj(MessageType.RtuCmdResponse, json);
|
}
|
}catch(Exception e){
|
log.error(e.getMessage(), e);
|
}
|
|
}
|
}
|