|
@@ -2,7 +2,9 @@ package com.hb.proj.gather.scheduler;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.concurrent.Callable;
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
@@ -85,9 +87,10 @@ public class GatherLiquidTask implements Callable<Integer> {
|
|
|
|
|
|
channel.attr(ChannelGroupMgr.ATTR_KEY_STOP_NEXT).set(false); //每次任务开始前重置
|
|
|
byteBuf=alloc.directBuffer();
|
|
|
-
|
|
|
+ Integer rst=null;
|
|
|
for(ZLOpdProtCMDEnum cmd : cmds) {
|
|
|
|
|
|
+ /*
|
|
|
if(needCloseChannel()) {
|
|
|
//ChannelGroupMgr.disconnect(channel);
|
|
|
channel.close();
|
|
@@ -114,11 +117,27 @@ public class GatherLiquidTask implements Callable<Integer> {
|
|
|
}
|
|
|
|
|
|
if(checkCancel(cmd.name())) {
|
|
|
- logger.info("{}本次动液面采集取消(中途有数据未采到)",serialAddrNum);
|
|
|
+ channel.close();
|
|
|
+ logger.info("{}本次动液面采集取消(中途有数据未采到),准备关闭连接,等待重连",serialAddrNum);
|
|
|
+ return TaskFutureCode.CLOSED;
|
|
|
//regather(); //此处补采造成,future.get() 一直锁定
|
|
|
- return TaskFutureCode.RETRY;
|
|
|
+ //return TaskFutureCode.RETRY;
|
|
|
}
|
|
|
-
|
|
|
+ */
|
|
|
+
|
|
|
+ rst=writeCMD(byteBuf,cmd,addrNum,1); //目前限制只重试1次
|
|
|
+ if(rst==TaskFutureCode.SUCCESS) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if(rst==TaskFutureCode.CANCELED) {
|
|
|
+ return TaskFutureCode.CANCELED;
|
|
|
+ }
|
|
|
+ else if(rst==TaskFutureCode.FAILED) {
|
|
|
+ channel.close();
|
|
|
+ logger.info("动液面设备:{},本次动液面采集取消(中途有数据未采到:{}),准备关闭连接,等待重连",serialAddrNum,cmd.name());
|
|
|
+ return TaskFutureCode.CLOSED;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
return TaskFutureCode.SUCCESS;
|
|
@@ -141,6 +160,48 @@ public class GatherLiquidTask implements Callable<Integer> {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ private Integer writeCMD(ByteBuf byteBuf,ZLOpdProtCMDEnum cmd,Integer addrNum,int retryCount) throws InterruptedException {
|
|
|
+
|
|
|
+ String serialAddrNum=channel.attr(ChannelGroupMgr.ATTR_KEY_SERIAL).get()+"-"+String.valueOf(addrNum);
|
|
|
+
|
|
|
+ byteBuf.readerIndex(byteBuf.writerIndex());
|
|
|
+
|
|
|
+ byteBuf.writeBytes(ByteUtils.buildExeCMD(cmd.getCmd(),addrNum));
|
|
|
+ channel.writeAndFlush(byteBuf.retainedSlice());
|
|
|
+
|
|
|
+ channel.attr(ChannelGroupMgr.ATTR_KEY_CMD).set(cmd.name());
|
|
|
+ channel.attr(ChannelGroupMgr.ATTR_KEY_PRE_TIME).set((new Date()).getTime());
|
|
|
+
|
|
|
+ logger.info("动液面设备【{}】发送完指令:{},{}",serialAddrNum,cmd.name(),ByteUtils.toHexString(cmd.getCmd()));
|
|
|
+
|
|
|
+ channel.wait(cmdTimeout); //等待接收返回数据后继续,最多等待cmdTimeout,此处释放锁,回复还未收到就被多值任务获得锁并发指令,会导致两个指令间隔很短
|
|
|
+
|
|
|
+ if(channel.attr(ChannelGroupMgr.ATTR_KEY_STOP_NEXT).get()) {
|
|
|
+ logger.info("本次动液面采集取消(数据已采集过)");
|
|
|
+ return TaskFutureCode.CANCELED;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isTimeout()) {
|
|
|
+ if(retryCount>0) {
|
|
|
+ logger.info("动液面设备【{}】,采集超时失败,准备300ms后重新采集{},重试序号{}",serialAddrNum,cmd.name(),retryCount);
|
|
|
+ Thread.sleep(300);
|
|
|
+ return writeCMD(byteBuf,cmd,addrNum,--retryCount);
|
|
|
+ }
|
|
|
+ return TaskFutureCode.FAILED;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TaskFutureCode.SUCCESS;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean isTimeout() {
|
|
|
+ Long pre=channel.attr(ChannelGroupMgr.ATTR_KEY_PRE_TIME).get();
|
|
|
+ if(pre==null||pre==0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return ((new Date()).getTime()-pre.longValue())>(cmdTimeout-1000);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private boolean checkCancel(String cmdName) {
|
|
|
|
|
|
Long pre=channel.attr(ChannelGroupMgr.ATTR_KEY_PRE_TIME).get();
|