|
@@ -3,6 +3,7 @@ package com.hb.proj.gather.scheduler;
|
|
|
import java.util.Iterator;
|
|
|
import java.util.List;
|
|
|
import java.util.Timer;
|
|
|
+import java.util.concurrent.Future;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
@@ -117,6 +118,7 @@ public class GatherScheduler {
|
|
|
|
|
|
Iterator<Channel> iterator=ChannelGroupMgr.iterator();
|
|
|
Channel channel=null;
|
|
|
+ Future<Boolean> chnTskFuture=null;
|
|
|
String serial=null;
|
|
|
List<GatherDevicePO> devices=null;
|
|
|
|
|
@@ -130,6 +132,22 @@ public class GatherScheduler {
|
|
|
}
|
|
|
|
|
|
for(GatherDevicePO dev : devices) {
|
|
|
+ chnTskFuture=ChannelGroupMgr.getFuture(serial);
|
|
|
+ try {
|
|
|
+ if(chnTskFuture!=null) {
|
|
|
+ chnTskFuture.get(80, TimeUnit.SECONDS); //最多等25s在执行任务(心跳20s),在25s内返回的可以继续下个任务
|
|
|
+ }
|
|
|
+ submitTask(channel,dev.getAddrNum(),deviceType,isMulti);
|
|
|
+ } catch (Exception e) {
|
|
|
+ //e.printStackTrace();
|
|
|
+ chnTskFuture.cancel(true); //任务线程应该有可被中断的处理在能结束任务
|
|
|
+ logger.error("等待通道未执行任务25s超时,取消该通道其它任务");
|
|
|
+ //超过25s通道任务还未执行完,大概率通道有问题,没有必要进行该通道的其它任务
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
if(ChannelGroupMgr.isDone(serial)) { //isDone 保证同一通道同一时间只有一个任务在执行
|
|
|
submitTask(channel,dev.getAddrNum(),deviceType,isMulti);
|
|
|
}
|
|
@@ -138,13 +156,14 @@ public class GatherScheduler {
|
|
|
try {
|
|
|
ChannelGroupMgr.getFuture(serial).get(20, TimeUnit.SECONDS); //最多等20s在执行任务
|
|
|
} catch (Exception e) {
|
|
|
- logger.error(e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ logger.error("通道有任务未结束,等待20s异常:{},{}",e.getMessage());
|
|
|
}
|
|
|
if(ChannelGroupMgr.isDone(serial)) { //等待一定时间后,及时加入周期任务(前提等待后前一任务执行完),不用等到下个周期才执行
|
|
|
submitTask(channel,dev.getAddrNum(),deviceType,isMulti);
|
|
|
logger.warn("延后补偿采集,通道:{},设备地址号:{},采集类型:{}",serial,dev.getAddrNum(),deviceType);
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
}
|
|
|
|
|
|
|