|
@@ -1,13 +1,16 @@
|
|
|
package com.hb.proj.gather.scheduler;
|
|
|
|
|
|
import java.util.Iterator;
|
|
|
+import java.util.List;
|
|
|
import java.util.Timer;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import com.hb.proj.gather.model.GatherConfig;
|
|
|
+import com.hb.proj.gather.model.GatherDevicePO;
|
|
|
import com.hb.proj.gather.process.DataTransConfig;
|
|
|
import com.hb.proj.gather.protocol.ChannelGroupMgr;
|
|
|
import com.hb.proj.utils.ConfigUtils;
|
|
@@ -67,7 +70,7 @@ public class GatherScheduler {
|
|
|
|
|
|
@Override
|
|
|
public void run() {
|
|
|
- startGather(false);
|
|
|
+ startGather("gather",false);
|
|
|
}
|
|
|
|
|
|
};
|
|
@@ -76,7 +79,7 @@ public class GatherScheduler {
|
|
|
|
|
|
@Override
|
|
|
public void run() {
|
|
|
- startGather(true);
|
|
|
+ startGather("gather",true);
|
|
|
}
|
|
|
|
|
|
};
|
|
@@ -85,7 +88,7 @@ public class GatherScheduler {
|
|
|
|
|
|
@Override
|
|
|
public void run() {
|
|
|
- startLiquidGather();
|
|
|
+ startGather("liquid",true);
|
|
|
}
|
|
|
|
|
|
};
|
|
@@ -105,57 +108,67 @@ public class GatherScheduler {
|
|
|
|
|
|
/**
|
|
|
* isMulti:true 多值采集,false:单值采集
|
|
|
- * @param isMulti
|
|
|
+ * [2024.11.4]调整为2级循环:1级:网络通道;2级:通道所挂载的采集设备
|
|
|
+ * @param deviceType:[liquid、gather]
|
|
|
+ * @param isMulti 单值/图形采集,deviceType=gather 才有效
|
|
|
*/
|
|
|
- public void startGather(boolean isMulti) {
|
|
|
+ public void startGather(String deviceType,boolean isMulti) {
|
|
|
logger.info("{}定时采集启动...",isMulti?"多值":"单值");
|
|
|
+
|
|
|
Iterator<Channel> iterator=ChannelGroupMgr.iterator();
|
|
|
Channel channel=null;
|
|
|
String serial=null;
|
|
|
+ List<GatherDevicePO> devices=null;
|
|
|
+
|
|
|
while(iterator.hasNext()) {
|
|
|
channel=iterator.next();
|
|
|
serial=channel.attr(ChannelGroupMgr.ATTR_KEY_SERIAL).get();
|
|
|
- if(DataTransConfig.isGatherDev(serial) && ChannelGroupMgr.isDone(serial)) { //isDone 保证同一设备同一时间只有一个任务在执行
|
|
|
- ChannelGroupMgr.addFuture(serial,GatherTaskExecutor.submit(new GatherTask(channel,isMulti)));
|
|
|
+
|
|
|
+ devices=DataTransConfig.getDevsByChnAndType(serial, deviceType);
|
|
|
+ if(devices==null) {
|
|
|
+ continue;
|
|
|
}
|
|
|
- else if(!ChannelGroupMgr.isDone(serial)) {
|
|
|
- logger.warn("设备{}有任务未结束,本次{}采集忽略",serial,isMulti?"多值":"单值");
|
|
|
+
|
|
|
+ for(GatherDevicePO dev : devices) {
|
|
|
+ if(ChannelGroupMgr.isDone(serial)) { //isDone 保证同一通道同一时间只有一个任务在执行
|
|
|
+ submitTask(channel,dev.getAddrNum(),deviceType,isMulti);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ logger.warn("通道{}有任务未结束,本次设备序号:{},开始检测是否可延后补偿采集{}",serial,dev.getAddrNum(),deviceType);
|
|
|
+ try {
|
|
|
+ ChannelGroupMgr.getFuture(serial).get(20, TimeUnit.SECONDS); //最多等20s在执行任务
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error(e.getMessage());
|
|
|
+ }
|
|
|
+ if(ChannelGroupMgr.isDone(serial)) { //等待一定时间后,及时加入周期任务(前提等待后前一任务执行完),不用等到下个周期才执行
|
|
|
+ submitTask(channel,dev.getAddrNum(),deviceType,isMulti);
|
|
|
+ logger.warn("延后补偿采集,通道:{},设备地址号:{},采集类型:{}",serial,dev.getAddrNum(),deviceType);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 单值1分钟执行一次采集,首次等待1分钟,等待服务启动,设备连接上
|
|
|
- */
|
|
|
- //@Scheduled(fixedRate=60*1000,initialDelay= 60000) //每分钟执行一次
|
|
|
- /*
|
|
|
- public void startGather() {
|
|
|
- logger.info("定时采集启动...");
|
|
|
- scheNum+=1;
|
|
|
- Iterator<Channel> iterator=ChannelGroupMgr.iterator();
|
|
|
- Channel channel=null;
|
|
|
- while(iterator.hasNext()) {
|
|
|
- channel=iterator.next();
|
|
|
- if(DataTransConfig.isGatherDev(channel.attr(ChannelGroupMgr.ATTR_KEY_SERIAL).get())) {
|
|
|
- GatherTaskExecutor.execute(new GatherTask(channel)); //复合任务包含单值、多值
|
|
|
- }
|
|
|
-
|
|
|
+ private void submitTask(Channel channel,int addrNum,String deviceType,boolean isMulti) {
|
|
|
+ String serial=channel.attr(ChannelGroupMgr.ATTR_KEY_SERIAL).get();
|
|
|
+ Runnable task=new GatherTask(channel,addrNum,isMulti);
|
|
|
+ if("liquid".equalsIgnoreCase(deviceType)) {
|
|
|
+ task=new GatherLiquidTask(channel,addrNum);
|
|
|
}
|
|
|
-
|
|
|
- scheNum=scheNum%5==0?0:scheNum;
|
|
|
+ ChannelGroupMgr.addFuture(serial,GatherTaskExecutor.submit(task));
|
|
|
}
|
|
|
- */
|
|
|
+
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 动液面定时采集
|
|
|
*/
|
|
|
- //@Scheduled(fixedRate = 20 * 60 * 1000,initialDelay= 300000)
|
|
|
+ //@Scheduled(fixedRate = 20 * 60 * 1000,initialDelay= 300000)
|
|
|
+
|
|
|
+ /*
|
|
|
public void startLiquidGather() {
|
|
|
logger.info("动液面定时采集启动...");
|
|
|
Iterator<Channel> iterator=ChannelGroupMgr.iterator();
|
|
@@ -169,7 +182,7 @@ public class GatherScheduler {
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
|
|
|
@PreDestroy
|