zhoupeng 1 jaar geleden
bovenliggende
commit
436bc128e7

+ 157 - 167
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java

@@ -12,14 +12,11 @@ import com.example.opc_da.dynamicSchedule.CronTaskRegister;
 import com.example.opc_da.util.OpcDaUtil;
 import com.example.opc_da.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
-import org.openscada.opc.dcom.da.OPCSERVERSTATE;
-import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
 import org.openscada.opc.lib.da.Item;
 import org.openscada.opc.lib.da.*;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
 
 import static com.example.opc_da.util.OpcDaUtil.getVal;
 
@@ -86,204 +83,197 @@ public class OpcDaChangeTask extends TimerTask {
 
     @Override
     public void run() {
-        Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
+        Integer dataSourceId = dataSource.getId();
         Integer readModeType = itemGroup.getReadModeType();
         Double modeValue = itemGroup.getModeValue();
-        Integer dataSourceId = dataSource.getId();
-        try {
-            AtomicReference<Long> index = new AtomicReference<>(0L);
-            server.connect();
-            server.addStateListener(connected -> {
-                if (!connected) {
+        Server server = OpcDaUtil.createServer(dataSource);
+        Long index = 0L;
+        AutoReconnectController autoReconnectController = new AutoReconnectController(server);
+        autoReconnectController.addListener(new AutoReconnectListener() {
+            private int trueCount = 0;
+            private int flaseCount = 0;
+
+            @Override
+            public void stateChanged(AutoReconnectState state) {
+                if (state.equals(AutoReconnectState.CONNECTED)) {
+                    if (trueCount != 0) {
+                        log.info("-----" + "重连成功");
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                "服务重新连接成功",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                    }
+                    trueCount++;
+                }
+                if (state.equals(AutoReconnectState.DISCONNECTED)) {
                     Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
                     if (Blank.isEmpty(flage)) {
                         flage = false;
                     }
                     if (flage) {
-                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
-                                "服务断开,马上进行重新连接",
-                                ConstantStr.NO_READ));
-                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                        Timer listenerTimer = new Timer();
-                        listenerTimer.schedule(new TimerTask() {
-                            @Override
-                            public void run() {
-                                try {
-                                    server.connect();
-                                    if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
-                                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
-                                                "服务重新连接成功",
-                                                ConstantStr.NO_READ));
-                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
-                                        listenerTimer.cancel();
-                                    }
-                                } catch (Exception e) {
-//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
-//                                String message = OpcDaUtil.genException(e.getMessage());
-//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
-//                                        message,
-//                                        ConstantStr.NO_READ));
-//                                listenerTimer.cancel();
-                                }
-                            }
-                        }, 60000);
+                        if (flaseCount != 0) {
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                    "服务断开,马上进行重新连接",
+                                    ConstantStr.NO_READ));
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        }
                     }
-                }else{
-                    try {
+                    flaseCount++;
+                }
+            }
+        });
+        try {
+            server.connect();
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        } finally {
+            autoReconnectController.connect();
+        }
+        String sqlCurrentYmdh = "";
+        while (true) {
+            try {
+                Thread.sleep(1000);
+                try {
+                    if (Blank.isNotEmpty(server.getServerState())) {
                         Group group = server.addGroup();
                         Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
                         Set itemSet = new HashSet(itemResult.values());
                         org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
                         itemSet.toArray(itemArr);
-                        String sqlCurrentYmdh = "";
-                        while (true) {
-                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                            if (Blank.isEmpty(flage)) {
-                                flage = false;
+
+                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                        if (Blank.isEmpty(flage)) {
+                            flage = false;
+                        }
+                        if (!flage) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                            if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                             }
-                            if (!flage) {
-                                //执行组装数据库的数据,以及生成驱动报表
-                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                }
-                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                if (Blank.isNotEmpty(server)) {
-                                    server.dispose();
-                                }
-                                cronTaskRegister.removeCronTask(cronId);
-                                redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                                timer.cancel();
-                                break;
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
                             }
-                            if (System.currentTimeMillis() >= endTime) {
-                                //执行组装数据库的数据,以及生成驱动报表
-                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                }
-                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                if (Blank.isNotEmpty(server)) {
-                                    server.dispose();
-                                }
-                                timer.cancel();
-                                break;
+                            cronTaskRegister.removeCronTask(cronId);
+                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                            timer.cancel();
+                            break;
+                        }
+                        if (System.currentTimeMillis() >= endTime) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                            if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                             }
-                            try {
-                                Thread.sleep(1000);
-                                OPCSERVERSTATUS serverState = server.getServerState();
-                                if (Blank.isEmpty(serverState)){
-                                    break;
-                                }
-                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
-                                index.getAndSet(index.get() + 1);
-                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
-                                for (Item key : resultMap.keySet()) {
-                                    String keyId = key.getId();
-                                    ItemState itemMap = resultMap.get(key);
-                                    Map<String, Object> val = getVal(itemMap.getValue());
-                                    String javaType = val.get("javaType").toString();
-                                    Object value = val.get("value");
-                                    Date time = itemMap.getTimestamp().getTime();
-                                    String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                                    String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                                    if (Blank.isEmpty(sqlCurrentYmdh)) {
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            timer.cancel();
+                            break;
+                        }
+                        try {
+                            Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                            index++;
+
+                            List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                            for (Item key : resultMap.keySet()) {
+                                String keyId = key.getId();
+                                ItemState itemMap = resultMap.get(key);
+                                Map<String, Object> val = getVal(itemMap.getValue());
+                                String javaType = val.get("javaType").toString();
+                                Object value = val.get("value");
+                                Date time = itemMap.getTimestamp().getTime();
+                                String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                                if (Blank.isEmpty(sqlCurrentYmdh)) {
+                                    sqlCurrentYmdh = currentYmdh;
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                                } else {
+                                    if (!sqlCurrentYmdh.equals(currentYmdh)) {
+                                        //组装相应的原始数据
+                                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                         sqlCurrentYmdh = currentYmdh;
-                                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                                    } else {
-                                        if (!sqlCurrentYmdh.equals(currentYmdh)) {
-                                            //组装相应的原始数据
-                                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                            sqlCurrentYmdh = currentYmdh;
-                                        }
                                     }
-                                    if (!javaType.toLowerCase().equals("boolean")) {
-                                        try {
-                                            DataModel dm = map.get(keyId);
-                                            if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
-                                                    && dm.getOperationRule().equals(value.toString())) {
+                                }
+                                if (!javaType.toLowerCase().equals("boolean")) {
+                                    try {
+                                        DataModel dm = map.get(keyId);
+                                        if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                                && dm.getOperationRule().equals(value.toString())) {
 
+                                        } else {
+                                            BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                            BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                            Object oldValue = redisUtil.get(ConstantStr.VALUE + id + keyId);
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                    currentYmdhmss, index, currentYmdh,
+                                                    ConstantStr.IS_RECORD, new Date());
+                                            if (Blank.isEmpty(oldValue)) {
+                                                cursorRawDataList.add(cursorRawData);
                                             } else {
-                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
-                                                Object oldValue = redisUtil.get(ConstantStr.VALUE + id + keyId);
-                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                        currentYmdhmss, index.get(), currentYmdh,
-                                                        ConstantStr.IS_RECORD, new Date());
-                                                if (Blank.isEmpty(oldValue)) {
+                                                if ((MathUtil.isMeetChange((BigDecimal) oldValue,
+                                                        dmData, new BigDecimal(modeValue), readModeType)).equals(ConstantStr.IS_RECORD)) {
                                                     cursorRawDataList.add(cursorRawData);
-                                                } else {
-                                                    if ((MathUtil.isMeetChange((BigDecimal) oldValue,
-                                                            dmData, new BigDecimal(modeValue), readModeType)).equals(ConstantStr.IS_RECORD)) {
-                                                        cursorRawDataList.add(cursorRawData);
-                                                    }
                                                 }
-                                                redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
                                             }
-                                        } catch (Exception e) {
-
+                                            redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
                                         }
+                                    } catch (Exception e) {
+
                                     }
                                 }
-                                if (Blank.isNotEmpty(cursorRawDataList)) {
-                                    opcAsyncTask.addCursorRawDataList(cursorRawDataList);
-                                    cursorRawDataList = new ArrayList<>();
-                                }
-                            } catch (Exception e) {
-                                flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                                if (Blank.isEmpty(flage)) {
-                                    flage = false;
-                                }
-                                if (!flage) {
-                                    //执行组装数据库的数据,以及生成驱动报表
-                                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                    if (Blank.isNotEmpty(server)) {
-                                        server.dispose();
-                                    }
-                                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                                    cronTaskRegister.removeCronTask(cronId);
-                                    timer.cancel();
+                            }
+                            if (Blank.isNotEmpty(cursorRawDataList)) {
+                                opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                                cursorRawDataList = new ArrayList<>();
+                            }
+                        } catch (Exception e) {
+                            flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
+                            }
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
                                 }
+                                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                                cronTaskRegister.removeCronTask(cronId);
+                                timer.cancel();
                             }
                         }
-                    } catch (Exception e) {
-                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                        if (Blank.isEmpty(flage)) {
-                            flage = false;
-                        }
-                        if (!flage) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                            cronTaskRegister.removeCronTask(cronId);
-                            timer.cancel();
+                    }
+                } catch (Exception e) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (!flage) {
+                        //执行组装数据库的数据,以及生成驱动报表
+                        sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                        redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                        if (Blank.isNotEmpty(server)) {
+                            server.dispose();
                         }
+                        itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                        cronTaskRegister.removeCronTask(cronId);
+                        timer.cancel();
                     }
                 }
-            });
-        } catch (Exception e) {
-            String message = OpcDaUtil.genException(e.getMessage());
-            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                    message,
-                    ConstantStr.NO_READ));
-            if (Blank.isNotEmpty(server)) {
-                server.dispose();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
-            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-            cronTaskRegister.removeCronTask(cronId);
-            timer.cancel();
         }
+
     }
 }

+ 291 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask4.java

@@ -0,0 +1,291 @@
+package com.example.opc_da.task;
+
+import com.alibaba.fastjson.JSON;
+import com.example.opc_common.entity.*;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_common.util.DateUtil;
+import com.example.opc_common.util.MathUtil;
+import com.example.opc_da.dao.ItemGroupDao;
+import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dynamicSchedule.CronTaskRegister;
+import com.example.opc_da.util.OpcDaUtil;
+import com.example.opc_da.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.openscada.opc.dcom.da.OPCSERVERSTATE;
+import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
+import org.openscada.opc.lib.da.Group;
+import org.openscada.opc.lib.da.Item;
+import org.openscada.opc.lib.da.ItemState;
+import org.openscada.opc.lib.da.Server;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static com.example.opc_da.util.OpcDaUtil.getVal;
+
+@Slf4j
+public class OpcDaChangeTask4 extends TimerTask {
+
+    private final RedisUtil redisUtil;
+
+    private final OpcAsyncTask opcAsyncTask;
+
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
+    private final ItemGroupDao itemGroupDao;
+
+    private final MessageNoticeDao messageNoticeDao;
+
+    private final Timer timer;
+
+    private final ItemGroup itemGroup;
+
+    private final DataSource dataSource;
+
+    private final Map<String, DataModel> map;
+
+    private final List<com.example.opc_common.entity.Item> itemList;
+
+    private final String[] items;
+
+    private final String timeFormat;
+
+    private final Long endTime;
+
+    public OpcDaChangeTask4(RedisUtil redisUtil,
+                            OpcAsyncTask opcAsyncTask,
+                            String cronId,
+                            CronTaskRegister cronTaskRegister,
+                            ItemGroupDao itemGroupDao,
+                            MessageNoticeDao messageNoticeDao,
+                            Timer timer,
+                            ItemGroup itemGroup,
+                            DataSource dataSource,
+                            Map<String, DataModel> map,
+                            List<com.example.opc_common.entity.Item> itemList,
+                            String[] items,
+                            String timeFormat,
+                            Long endTime) {
+        this.redisUtil = redisUtil;
+        this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
+        this.itemGroupDao = itemGroupDao;
+        this.messageNoticeDao = messageNoticeDao;
+        this.timer = timer;
+        this.itemGroup = itemGroup;
+        this.dataSource = dataSource;
+        this.map = map;
+        this.itemList = itemList;
+        this.items = items;
+        this.timeFormat = timeFormat;
+        this.endTime = endTime;
+    }
+
+    @Override
+    public void run() {
+        Server server = OpcDaUtil.createServer(dataSource);
+        Integer id = itemGroup.getId();
+        Integer readModeType = itemGroup.getReadModeType();
+        Double modeValue = itemGroup.getModeValue();
+        Integer dataSourceId = dataSource.getId();
+        try {
+            AtomicReference<Long> index = new AtomicReference<>(0L);
+            server.connect();
+            server.addStateListener(connected -> {
+                if (!connected) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (flage) {
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                "服务断开,马上进行重新连接",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        Timer listenerTimer = new Timer();
+                        listenerTimer.schedule(new TimerTask() {
+                            @Override
+                            public void run() {
+                                try {
+                                    server.connect();
+                                    if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
+                                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                                "服务重新连接成功",
+                                                ConstantStr.NO_READ));
+                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                                        listenerTimer.cancel();
+                                    }
+                                } catch (Exception e) {
+//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
+//                                String message = OpcDaUtil.genException(e.getMessage());
+//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
+//                                        message,
+//                                        ConstantStr.NO_READ));
+//                                listenerTimer.cancel();
+                                }
+                            }
+                        }, 60000);
+                    }
+                }else{
+                    try {
+                        Group group = server.addGroup();
+                        Map<String, Item> itemResult = group.addItems(items);
+                        Set itemSet = new HashSet(itemResult.values());
+                        Item[] itemArr = new Item[itemSet.size()];
+                        itemSet.toArray(itemArr);
+                        String sqlCurrentYmdh = "";
+                        while (true) {
+                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
+                            }
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                }
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                cronTaskRegister.removeCronTask(cronId);
+                                redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                                timer.cancel();
+                                break;
+                            }
+                            if (System.currentTimeMillis() >= endTime) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                }
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                timer.cancel();
+                                break;
+                            }
+                            try {
+                                Thread.sleep(1000);
+                                OPCSERVERSTATUS serverState = server.getServerState();
+                                if (Blank.isEmpty(serverState)){
+                                    break;
+                                }
+                                Map<Item, ItemState> resultMap = group.read(true, itemArr);
+                                index.getAndSet(index.get() + 1);
+                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                                for (Item key : resultMap.keySet()) {
+                                    String keyId = key.getId();
+                                    ItemState itemMap = resultMap.get(key);
+                                    Map<String, Object> val = getVal(itemMap.getValue());
+                                    String javaType = val.get("javaType").toString();
+                                    Object value = val.get("value");
+                                    Date time = itemMap.getTimestamp().getTime();
+                                    String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                                    String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                                    if (Blank.isEmpty(sqlCurrentYmdh)) {
+                                        sqlCurrentYmdh = currentYmdh;
+                                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                                    } else {
+                                        if (!sqlCurrentYmdh.equals(currentYmdh)) {
+                                            //组装相应的原始数据
+                                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                            sqlCurrentYmdh = currentYmdh;
+                                        }
+                                    }
+                                    if (!javaType.toLowerCase().equals("boolean")) {
+                                        try {
+                                            DataModel dm = map.get(keyId);
+                                            if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                                    && dm.getOperationRule().equals(value.toString())) {
+
+                                            } else {
+                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                                Object oldValue = redisUtil.get(ConstantStr.VALUE + id + keyId);
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                        currentYmdhmss, index.get(), currentYmdh,
+                                                        ConstantStr.IS_RECORD, new Date());
+                                                if (Blank.isEmpty(oldValue)) {
+                                                    cursorRawDataList.add(cursorRawData);
+                                                } else {
+                                                    if ((MathUtil.isMeetChange((BigDecimal) oldValue,
+                                                            dmData, new BigDecimal(modeValue), readModeType)).equals(ConstantStr.IS_RECORD)) {
+                                                        cursorRawDataList.add(cursorRawData);
+                                                    }
+                                                }
+                                                redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                            }
+                                        } catch (Exception e) {
+
+                                        }
+                                    }
+                                }
+                                if (Blank.isNotEmpty(cursorRawDataList)) {
+                                    opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                                    cursorRawDataList = new ArrayList<>();
+                                }
+                            } catch (Exception e) {
+                                flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                                if (Blank.isEmpty(flage)) {
+                                    flage = false;
+                                }
+                                if (!flage) {
+                                    //执行组装数据库的数据,以及生成驱动报表
+                                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                    if (Blank.isNotEmpty(server)) {
+                                        server.dispose();
+                                    }
+                                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                                    cronTaskRegister.removeCronTask(cronId);
+                                    timer.cancel();
+                                }
+                            }
+                        }
+                    } catch (Exception e) {
+                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                        if (Blank.isEmpty(flage)) {
+                            flage = false;
+                        }
+                        if (!flage) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                            cronTaskRegister.removeCronTask(cronId);
+                            timer.cancel();
+                        }
+                    }
+                }
+            });
+        } catch (Exception e) {
+            String message = OpcDaUtil.genException(e.getMessage());
+            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+                    message,
+                    ConstantStr.NO_READ));
+            if (Blank.isNotEmpty(server)) {
+                server.dispose();
+            }
+            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+            cronTaskRegister.removeCronTask(cronId);
+            timer.cancel();
+        }
+    }
+}

+ 195 - 210
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask.java

@@ -11,15 +11,10 @@ import com.example.opc_da.dao.MessageNoticeDao;
 import com.example.opc_da.dynamicSchedule.CronTaskRegister;
 import com.example.opc_da.util.OpcDaUtil;
 import com.example.opc_da.util.RedisUtil;
-import org.openscada.opc.dcom.da.OPCSERVERSTATE;
-import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
-import org.openscada.opc.lib.da.Group;
-import org.openscada.opc.lib.da.ItemState;
-import org.openscada.opc.lib.da.Server;
+import org.openscada.opc.lib.da.*;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
 
 import static com.example.opc_da.util.OpcDaUtil.getVal;
 
@@ -85,258 +80,248 @@ public class OpcDaExceedTask extends TimerTask {
 
     @Override
     public void run() {
-        Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
+        Integer dataSourceId = dataSource.getId();
         Integer eventMode = itemGroup.getEventMode();
         Double modeValue = itemGroup.getModeValue();
-        Integer dataSourceId = dataSource.getId();
+        Server server = OpcDaUtil.createServer(dataSource);
         String driverItem = OpcDaUtil.getDriverItem(itemList);
-        try {
-            AtomicReference<Long> index = new AtomicReference<>(0L);
-            server.connect();
-            server.addStateListener(connected -> {
-                if (!connected) {
+        Long index = 0L;
+        AutoReconnectController autoReconnectController = new AutoReconnectController(server);
+        autoReconnectController.addListener(new AutoReconnectListener() {
+            private int trueCount = 0;
+            private int flaseCount = 0;
+
+            @Override
+            public void stateChanged(AutoReconnectState state) {
+                if (state.equals(AutoReconnectState.CONNECTED)) {
+                    if (trueCount != 0) {
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                "服务重新连接成功",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                    }
+                    trueCount++;
+                }
+                if (state.equals(AutoReconnectState.DISCONNECTED)) {
                     Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
                     if (Blank.isEmpty(flage)) {
                         flage = false;
                     }
                     if (flage) {
-                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
-                                "服务断开,马上进行重新连接",
-                                ConstantStr.NO_READ));
-                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                        Timer listenerTimer = new Timer();
-                        listenerTimer.schedule(new TimerTask() {
-                            @Override
-                            public void run() {
-                                try {
-                                    server.connect();
-                                    if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
-                                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
-                                                "服务重新连接成功",
-                                                ConstantStr.NO_READ));
-                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
-                                        listenerTimer.cancel();
-                                    }
-                                } catch (Exception e) {
-//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
-//                                String message = OpcDaUtil.genException(e.getMessage());
-//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
-//                                        message,
-//                                        ConstantStr.NO_READ));
-//                                listenerTimer.cancel();
-                                }
-                            }
-                        }, 60000);
+                        if (flaseCount != 0) {
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                    "服务断开,马上进行重新连接",
+                                    ConstantStr.NO_READ));
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        }
                     }
-                }else{
-                    try {
+                    flaseCount++;
+                }
+            }
+        });
+        try {
+            server.connect();
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        } finally {
+            autoReconnectController.connect();
+        }
+
+        while (true) {
+            try {
+                Thread.sleep(1000);
+                try {
+                    if (Blank.isNotEmpty(server.getServerState())) {
                         Group group = server.addGroup();
                         Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
                         Set itemSet = new HashSet(itemResult.values());
                         org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
                         itemSet.toArray(itemArr);
-                        while (true) {
-                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                            if (Blank.isEmpty(flage)) {
-                                flage = false;
-                            }
-                            if (!flage) {
-                                //执行组装数据库的数据,以及生成驱动报表
-                                opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
 
-                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                if (Blank.isNotEmpty(server)) {
-                                    server.dispose();
-                                }
-                                cronTaskRegister.removeCronTask(cronId);
-                                redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                                timer.cancel();
-                                break;
+                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                        if (Blank.isEmpty(flage)) {
+                            flage = false;
+                        }
+                        if (!flage) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
                             }
-                            if (System.currentTimeMillis() >= endTime) {
-                                //执行组装数据库的数据,以及生成驱动报表
-                                opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
-
-                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                if (Blank.isNotEmpty(server)) {
-                                    server.dispose();
-                                }
-                                timer.cancel();
-                                break;
+                            cronTaskRegister.removeCronTask(cronId);
+                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                            timer.cancel();
+                            break;
+                        }
+                        if (System.currentTimeMillis() >= endTime) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
                             }
-                            try {
-                                Thread.sleep(1000);
-                                OPCSERVERSTATUS serverState = server.getServerState();
-                                if (Blank.isEmpty(serverState)){
-                                    break;
+                            timer.cancel();
+                            break;
+                        }
+                        try {
+                            Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                            index++;
+
+                            List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                            for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
+                                String keyId = key.getId();
+                                ItemState itemMap = resultMap.get(key);
+                                Map<String, Object> val = getVal(itemMap.getValue());
+                                String javaType = val.get("javaType").toString();
+                                Object value = val.get("value");
+                                Date time = itemMap.getTimestamp().getTime();
+                                String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                                DataModel dm = map.get(keyId);
+                                if (keyId.equals(driverItem) && (index % 20 == 0)) {
+                                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index - 1L);
                                 }
-                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
-                                index.getAndSet(index.get() + 1);
-                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
-                                for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
-                                    String keyId = key.getId();
-                                    ItemState itemMap = resultMap.get(key);
-                                    Map<String, Object> val = getVal(itemMap.getValue());
-                                    String javaType = val.get("javaType").toString();
-                                    Object value = val.get("value");
-                                    Date time = itemMap.getTimestamp().getTime();
-                                    String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                                    String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                                    DataModel dm = map.get(keyId);
-                                    if (keyId.equals(driverItem) && (index.get() % 20 == 0)) {
-                                        opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
-                                    }
-                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
-                                        String valStr = value.toString();
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
-                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                                    String valStr = value.toString();
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                } else {
+                                    if (javaType.toLowerCase().equals("boolean")) {
+                                        String varStr = value.toString();
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, varStr, varStr,
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                         cursorRawDataList.add(cursorRawData);
                                     } else {
-                                        if (javaType.toLowerCase().equals("boolean")) {
-                                            String varStr = value.toString();
-                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, varStr,varStr,
-                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                                            cursorRawDataList.add(cursorRawData);
-                                        } else {
-                                            try {
-                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
-                                                if (keyId.equals(driverItem)) {
-                                                    BigDecimal bigDecimal1 = new BigDecimal(modeValue);
-                                                    if (eventMode == ConstantStr.EVENT_MODEL_EXCEED) {
+                                        try {
+                                            BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                            BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                            if (keyId.equals(driverItem)) {
+                                                BigDecimal bigDecimal1 = new BigDecimal(modeValue);
+                                                if (eventMode == ConstantStr.EVENT_MODEL_EXCEED) {
+                                                    if (dmData.compareTo(bigDecimal1) == 1) {
+                                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                        cursorRawDataList.add(cursorRawData);
+                                                    } else {
+                                                        cursorRawDataList = new ArrayList<>();
+                                                        break;
+                                                    }
+                                                } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
+                                                    if (dmData.compareTo(bigDecimal1) == -1) {
+                                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                        cursorRawDataList.add(cursorRawData);
+                                                    } else {
+                                                        cursorRawDataList = new ArrayList<>();
+                                                        break;
+                                                    }
+                                                } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
+                                                    if (dmData.compareTo(bigDecimal1) == 0) {
+                                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                        cursorRawDataList.add(cursorRawData);
+                                                    } else {
+                                                        cursorRawDataList = new ArrayList<>();
+                                                        break;
+                                                    }
+                                                } else if (eventMode == ConstantStr.EVENT_TRENDS_EXCEED) {
+                                                    if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != 1) {
                                                         if (dmData.compareTo(bigDecimal1) == 1) {
                                                             CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                                    currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                                             cursorRawDataList.add(cursorRawData);
                                                         } else {
                                                             cursorRawDataList = new ArrayList<>();
                                                             break;
                                                         }
-                                                    } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
+                                                    } else {
+                                                        cursorRawDataList = new ArrayList<>();
+                                                        break;
+                                                    }
+                                                    redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                                } else if (eventMode == ConstantStr.EVENT_TRENDS_LOWER) {
+                                                    if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != -1) {
                                                         if (dmData.compareTo(bigDecimal1) == -1) {
                                                             CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                            cursorRawDataList.add(cursorRawData);
-                                                        } else {
-                                                            cursorRawDataList = new ArrayList<>();
-                                                            break;
-                                                        }
-                                                    } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
-                                                        if (dmData.compareTo(bigDecimal1) == 0) {
-                                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                                    currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                                             cursorRawDataList.add(cursorRawData);
                                                         } else {
                                                             cursorRawDataList = new ArrayList<>();
                                                             break;
                                                         }
-                                                    } else if (eventMode == ConstantStr.EVENT_TRENDS_EXCEED) {
-                                                        if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != 1) {
-                                                            if (dmData.compareTo(bigDecimal1) == 1) {
-                                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                                cursorRawDataList.add(cursorRawData);
-                                                            } else {
-                                                                cursorRawDataList = new ArrayList<>();
-                                                                break;
-                                                            }
-                                                        } else {
-                                                            cursorRawDataList = new ArrayList<>();
-                                                            break;
-                                                        }
-                                                        redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
-                                                    } else if (eventMode == ConstantStr.EVENT_TRENDS_LOWER) {
-                                                        if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != -1) {
-                                                            if (dmData.compareTo(bigDecimal1) == -1) {
-                                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                                cursorRawDataList.add(cursorRawData);
-                                                            } else {
-                                                                cursorRawDataList = new ArrayList<>();
-                                                                break;
-                                                            }
-                                                        } else {
-                                                            cursorRawDataList = new ArrayList<>();
-                                                            break;
-                                                        }
-                                                        redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                                    } else {
+                                                        cursorRawDataList = new ArrayList<>();
+                                                        break;
                                                     }
-                                                } else {
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                                                    cursorRawDataList.add(cursorRawData);
-                                                }
-                                            } catch (Exception e) {
-                                                if (Blank.isNotEmpty(value)) {
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
-                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                                                    cursorRawDataList.add(cursorRawData);
-                                                } else {
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
-                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                                                    cursorRawDataList.add(cursorRawData);
+                                                    redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
                                                 }
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                cursorRawDataList.add(cursorRawData);
+                                            }
+                                        } catch (Exception e) {
+                                            if (Blank.isNotEmpty(value)) {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                cursorRawDataList.add(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                cursorRawDataList.add(cursorRawData);
                                             }
                                         }
                                     }
                                 }
-                                if (Blank.isNotEmpty(cursorRawDataList)) {
-                                    opcAsyncTask.addCursorRawDataList(cursorRawDataList);
-                                    cursorRawDataList = new ArrayList<>();
-                                }
-                            } catch (Exception e) {
-                                flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                                if (Blank.isEmpty(flage)) {
-                                    flage = false;
-                                }
-                                if (!flage) {
-                                    //执行组装数据库的数据,以及生成驱动报表
-                                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get());
-                                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                    if (Blank.isNotEmpty(server)) {
-                                        server.dispose();
-                                    }
-                                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                                    cronTaskRegister.removeCronTask(cronId);
-                                    timer.cancel();
+                            }
+                            if (Blank.isNotEmpty(cursorRawDataList)) {
+                                opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                                cursorRawDataList = new ArrayList<>();
+                            }
+                        } catch (Exception e) {
+                            flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
+                            }
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
                                 }
+                                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                                cronTaskRegister.removeCronTask(cronId);
+                                timer.cancel();
                             }
                         }
-                    } catch (Exception e) {
-                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                        if (Blank.isEmpty(flage)) {
-                            flage = false;
-                        }
-                        if (!flage) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
-                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                            cronTaskRegister.removeCronTask(cronId);
-                            timer.cancel();
+                    }
+                } catch (Exception e) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (!flage) {
+                        //执行组装数据库的数据,以及生成驱动报表
+                        opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                        redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                        if (Blank.isNotEmpty(server)) {
+                            server.dispose();
                         }
+                        itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                        cronTaskRegister.removeCronTask(cronId);
+                        timer.cancel();
                     }
                 }
-            });
-        } catch (Exception e) {
-            String message = OpcDaUtil.genException(e.getMessage());
-            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                    message,
-                    ConstantStr.NO_READ));
-            if (Blank.isNotEmpty(server)) {
-                server.dispose();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
-            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-            cronTaskRegister.removeCronTask(cronId);
-            timer.cancel();
         }
     }
 }

+ 342 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask4.java

@@ -0,0 +1,342 @@
+package com.example.opc_da.task;
+
+import com.alibaba.fastjson.JSON;
+import com.example.opc_common.entity.*;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_common.util.DateUtil;
+import com.example.opc_common.util.MathUtil;
+import com.example.opc_da.dao.ItemGroupDao;
+import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dynamicSchedule.CronTaskRegister;
+import com.example.opc_da.util.OpcDaUtil;
+import com.example.opc_da.util.RedisUtil;
+import org.openscada.opc.dcom.da.OPCSERVERSTATE;
+import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
+import org.openscada.opc.lib.da.Group;
+import org.openscada.opc.lib.da.ItemState;
+import org.openscada.opc.lib.da.Server;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static com.example.opc_da.util.OpcDaUtil.getVal;
+
+public class OpcDaExceedTask4 extends TimerTask {
+
+    private final RedisUtil redisUtil;
+
+    private final OpcAsyncTask opcAsyncTask;
+
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
+    private final ItemGroupDao itemGroupDao;
+
+    private final MessageNoticeDao messageNoticeDao;
+
+    private final Timer timer;
+
+    private final ItemGroup itemGroup;
+
+    private final DataSource dataSource;
+
+    private final Map<String, DataModel> map;
+
+    private final List<Item> itemList;
+
+    private final String[] items;
+
+    private final String timeFormat;
+
+    private final Long endTime;
+
+    public OpcDaExceedTask4(RedisUtil redisUtil,
+                            OpcAsyncTask opcAsyncTask,
+                            String cronId,
+                            CronTaskRegister cronTaskRegister,
+                            ItemGroupDao itemGroupDao,
+                            MessageNoticeDao messageNoticeDao,
+                            Timer timer,
+                            ItemGroup itemGroup,
+                            DataSource dataSource,
+                            Map<String, DataModel> map,
+                            List<Item> itemList,
+                            String[] items,
+                            String timeFormat,
+                            Long endTime) {
+        this.redisUtil = redisUtil;
+        this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
+        this.itemGroupDao = itemGroupDao;
+        this.messageNoticeDao = messageNoticeDao;
+        this.timer = timer;
+        this.itemGroup = itemGroup;
+        this.dataSource = dataSource;
+        this.map = map;
+        this.itemList = itemList;
+        this.items = items;
+        this.timeFormat = timeFormat;
+        this.endTime = endTime;
+    }
+
+    @Override
+    public void run() {
+        Server server = OpcDaUtil.createServer(dataSource);
+        Integer id = itemGroup.getId();
+        Integer eventMode = itemGroup.getEventMode();
+        Double modeValue = itemGroup.getModeValue();
+        Integer dataSourceId = dataSource.getId();
+        String driverItem = OpcDaUtil.getDriverItem(itemList);
+        try {
+            AtomicReference<Long> index = new AtomicReference<>(0L);
+            server.connect();
+            server.addStateListener(connected -> {
+                if (!connected) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (flage) {
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                "服务断开,马上进行重新连接",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        Timer listenerTimer = new Timer();
+                        listenerTimer.schedule(new TimerTask() {
+                            @Override
+                            public void run() {
+                                try {
+                                    server.connect();
+                                    if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
+                                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                                "服务重新连接成功",
+                                                ConstantStr.NO_READ));
+                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                                        listenerTimer.cancel();
+                                    }
+                                } catch (Exception e) {
+//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
+//                                String message = OpcDaUtil.genException(e.getMessage());
+//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
+//                                        message,
+//                                        ConstantStr.NO_READ));
+//                                listenerTimer.cancel();
+                                }
+                            }
+                        }, 60000);
+                    }
+                }else{
+                    try {
+                        Group group = server.addGroup();
+                        Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
+                        Set itemSet = new HashSet(itemResult.values());
+                        org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
+                        itemSet.toArray(itemArr);
+                        while (true) {
+                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
+                            }
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
+
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                cronTaskRegister.removeCronTask(cronId);
+                                redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                                timer.cancel();
+                                break;
+                            }
+                            if (System.currentTimeMillis() >= endTime) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
+
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                timer.cancel();
+                                break;
+                            }
+                            try {
+                                Thread.sleep(1000);
+                                OPCSERVERSTATUS serverState = server.getServerState();
+                                if (Blank.isEmpty(serverState)){
+                                    break;
+                                }
+                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                                index.getAndSet(index.get() + 1);
+                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                                for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
+                                    String keyId = key.getId();
+                                    ItemState itemMap = resultMap.get(key);
+                                    Map<String, Object> val = getVal(itemMap.getValue());
+                                    String javaType = val.get("javaType").toString();
+                                    Object value = val.get("value");
+                                    Date time = itemMap.getTimestamp().getTime();
+                                    String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                                    String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                                    DataModel dm = map.get(keyId);
+                                    if (keyId.equals(driverItem) && (index.get() % 20 == 0)) {
+                                        opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
+                                    }
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                                        String valStr = value.toString();
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    } else {
+                                        if (javaType.toLowerCase().equals("boolean")) {
+                                            String varStr = value.toString();
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, varStr,varStr,
+                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                            cursorRawDataList.add(cursorRawData);
+                                        } else {
+                                            try {
+                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                                if (keyId.equals(driverItem)) {
+                                                    BigDecimal bigDecimal1 = new BigDecimal(modeValue);
+                                                    if (eventMode == ConstantStr.EVENT_MODEL_EXCEED) {
+                                                        if (dmData.compareTo(bigDecimal1) == 1) {
+                                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                            cursorRawDataList.add(cursorRawData);
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                    } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
+                                                        if (dmData.compareTo(bigDecimal1) == -1) {
+                                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                            cursorRawDataList.add(cursorRawData);
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                    } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
+                                                        if (dmData.compareTo(bigDecimal1) == 0) {
+                                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                            cursorRawDataList.add(cursorRawData);
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                    } else if (eventMode == ConstantStr.EVENT_TRENDS_EXCEED) {
+                                                        if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != 1) {
+                                                            if (dmData.compareTo(bigDecimal1) == 1) {
+                                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                                cursorRawDataList.add(cursorRawData);
+                                                            } else {
+                                                                cursorRawDataList = new ArrayList<>();
+                                                                break;
+                                                            }
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                        redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                                    } else if (eventMode == ConstantStr.EVENT_TRENDS_LOWER) {
+                                                        if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != -1) {
+                                                            if (dmData.compareTo(bigDecimal1) == -1) {
+                                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                                cursorRawDataList.add(cursorRawData);
+                                                            } else {
+                                                                cursorRawDataList = new ArrayList<>();
+                                                                break;
+                                                            }
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                        redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                                    }
+                                                } else {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
+                                                }
+                                            } catch (Exception e) {
+                                                if (Blank.isNotEmpty(value)) {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
+                                                } else {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                                if (Blank.isNotEmpty(cursorRawDataList)) {
+                                    opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                                    cursorRawDataList = new ArrayList<>();
+                                }
+                            } catch (Exception e) {
+                                flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                                if (Blank.isEmpty(flage)) {
+                                    flage = false;
+                                }
+                                if (!flage) {
+                                    //执行组装数据库的数据,以及生成驱动报表
+                                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get());
+                                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                    if (Blank.isNotEmpty(server)) {
+                                        server.dispose();
+                                    }
+                                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                                    cronTaskRegister.removeCronTask(cronId);
+                                    timer.cancel();
+                                }
+                            }
+                        }
+                    } catch (Exception e) {
+                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                        if (Blank.isEmpty(flage)) {
+                            flage = false;
+                        }
+                        if (!flage) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                            cronTaskRegister.removeCronTask(cronId);
+                            timer.cancel();
+                        }
+                    }
+                }
+            });
+        } catch (Exception e) {
+            String message = OpcDaUtil.genException(e.getMessage());
+            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+                    message,
+                    ConstantStr.NO_READ));
+            if (Blank.isNotEmpty(server)) {
+                server.dispose();
+            }
+            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+            cronTaskRegister.removeCronTask(cronId);
+            timer.cancel();
+        }
+    }
+}

+ 162 - 183
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java

@@ -12,15 +12,10 @@ import com.example.opc_da.dynamicSchedule.CronTaskRegister;
 import com.example.opc_da.util.OpcDaUtil;
 import com.example.opc_da.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
-import org.openscada.opc.dcom.da.OPCSERVERSTATE;
-import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
-import org.openscada.opc.lib.da.Group;
-import org.openscada.opc.lib.da.ItemState;
-import org.openscada.opc.lib.da.Server;
+import org.openscada.opc.lib.da.*;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
 
 import static com.example.opc_da.util.OpcDaUtil.getVal;
 
@@ -103,218 +98,202 @@ public class OpcDaFrequencyTask extends TimerTask {
 
     @Override
     public void run() {
-        Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
         Integer dataSourceId = dataSource.getId();
-        try {
-            AtomicReference<Long> index= new AtomicReference<>(0L);
-            server.connect();
-            server.addStateListener(connected -> {
-                log.info("-----" + connected);
-                try {
-                    Thread.sleep(500);
-                }catch (Exception e){
+        Server server = OpcDaUtil.createServer(dataSource);
+        Long index = 0L;
+        AutoReconnectController autoReconnectController = new AutoReconnectController(server);
+        autoReconnectController.addListener(new AutoReconnectListener() {
+            private int trueCount = 0;
+            private int flaseCount = 0;
 
+            @Override
+            public void stateChanged(AutoReconnectState state) {
+                if (state.equals(AutoReconnectState.CONNECTED)) {
+                    if (trueCount != 0) {
+                        log.info("-----" + "重连成功");
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                "服务重新连接成功",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                    }
+                    trueCount++;
                 }
-                if (!connected) {
+                if (state.equals(AutoReconnectState.DISCONNECTED)) {
                     Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
                     if (Blank.isEmpty(flage)) {
                         flage = false;
                     }
                     if (flage) {
-                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
-                                "服务断开,马上进行重新连接",
-                                ConstantStr.NO_READ));
-                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                        Timer listenerTimer = new Timer();
-                        listenerTimer.schedule(new TimerTask() {
-                            @Override
-                            public void run() {
-                                try {
-                                    log.info("-----服务开始重连");
-                                    server.connect();
-                                    log.info("-----重连代码执行完毕");
-                                    if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
-                                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
-                                                "服务重新连接成功",
-                                                ConstantStr.NO_READ));
-                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
-                                        listenerTimer.cancel();
-                                    }
-                                } catch (Exception e) {
-//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
-//                                String message = OpcDaUtil.genException(e.getMessage());
-//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
-//                                        message,
-//                                        ConstantStr.NO_READ));
-//                                listenerTimer.cancel();
-                                }
-                            }
-                        }, 60000);
+                        if (flaseCount != 0) {
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                    "服务断开,马上进行重新连接",
+                                    ConstantStr.NO_READ));
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        }
                     }
-                } else {
-                    try {
+                    flaseCount++;
+                }
+            }
+        });
+        try {
+            server.connect();
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        } finally {
+            autoReconnectController.connect();
+        }
+        String sqlCurrentYmdh = "";
+
+        int count = (int) (Math.round(itemGroup.getModeValue() * 1000));
+        while (true) {
+            try {
+                Thread.sleep(count);
+                try {
+                    if (Blank.isNotEmpty(server.getServerState())) {
                         Group group = server.addGroup();
                         Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
                         Set itemSet = new HashSet(itemResult.values());
                         org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
                         itemSet.toArray(itemArr);
-                        String sqlCurrentYmdh = "";
-                        int count = (int) (Math.round(itemGroup.getModeValue() * 1000));
-                        while (true) {
-                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                            if (Blank.isEmpty(flage)) {
-                                flage = false;
+
+                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                        if (Blank.isEmpty(flage)) {
+                            flage = false;
+                        }
+                        if (!flage) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                            if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                             }
-                            if (!flage) {
-                                //执行组装数据库的数据,以及生成驱动报表
-                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                }
-                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                if (Blank.isNotEmpty(server)) {
-                                    server.dispose();
-                                }
-                                cronTaskRegister.removeCronTask(cronId);
-                                redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                                timer.cancel();
-                                break;
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
                             }
-                            if (System.currentTimeMillis() >= endTime) {
-                                //执行组装数据库的数据,以及生成驱动报表
-                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                }
-                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                if (Blank.isNotEmpty(server)) {
-                                    server.dispose();
-                                }
-                                timer.cancel();
-                                break;
+                            cronTaskRegister.removeCronTask(cronId);
+                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                            timer.cancel();
+                            break;
+                        }
+                        if (System.currentTimeMillis() >= endTime) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                            if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                             }
-                            try {
-                                Thread.sleep(count);
-                                OPCSERVERSTATUS serverState = server.getServerState();
-                                if (Blank.isEmpty(serverState)){
-                                    break;
-                                }
-                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
-                                index.getAndSet(index.get() + 1);
-                                log.info("-----" + index);
-                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
-                                for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
-                                    String keyId = key.getId();
-                                    ItemState itemMap = resultMap.get(key);
-                                    Map<String, Object> val = getVal(itemMap.getValue());
-                                    String javaType = val.get("javaType").toString();
-                                    Object value = val.get("value");
-                                    Date time = itemMap.getTimestamp().getTime();
-                                    String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                                    String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                                    DataModel dm = map.get(keyId);
-                                    if (Blank.isEmpty(sqlCurrentYmdh)) {
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            timer.cancel();
+                            break;
+                        }
+                        try {
+                            Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                            index++;
+
+                            List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                            for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
+                                String keyId = key.getId();
+                                ItemState itemMap = resultMap.get(key);
+                                Map<String, Object> val = getVal(itemMap.getValue());
+                                String javaType = val.get("javaType").toString();
+                                Object value = val.get("value");
+                                Date time = itemMap.getTimestamp().getTime();
+                                String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                                DataModel dm = map.get(keyId);
+                                if (Blank.isEmpty(sqlCurrentYmdh)) {
+                                    sqlCurrentYmdh = currentYmdh;
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                                } else {
+                                    if (!sqlCurrentYmdh.equals(currentYmdh)) {
+                                        //组装相应的原始数据
+                                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                         sqlCurrentYmdh = currentYmdh;
-                                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                                    } else {
-                                        if (!sqlCurrentYmdh.equals(currentYmdh)) {
-                                            //组装相应的原始数据
-                                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                            sqlCurrentYmdh = currentYmdh;
-                                        }
                                     }
-                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
-                                        String valStr = val.toString();
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
-                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                }
+                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                                    String valStr = val.toString();
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                } else {
+                                    if (javaType.toLowerCase().equals("boolean")) {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                         cursorRawDataList.add(cursorRawData);
                                     } else {
-                                        if (javaType.toLowerCase().equals("boolean")) {
-                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
-                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        try {
+                                            BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                            BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
+                                                    currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                             cursorRawDataList.add(cursorRawData);
-                                        } else {
-                                            try {
-                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
-                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
-                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        } catch (Exception e) {
+                                            if (Blank.isNotEmpty(value)) {
+                                                String valStr = value.toString();
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                cursorRawDataList.add(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                                 cursorRawDataList.add(cursorRawData);
-                                            } catch (Exception e) {
-                                                if (Blank.isNotEmpty(value)) {
-                                                    String valStr = value.toString();
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
-                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                    cursorRawDataList.add(cursorRawData);
-                                                } else {
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
-                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                    cursorRawDataList.add(cursorRawData);
-                                                }
                                             }
                                         }
                                     }
                                 }
-                                if (Blank.isNotEmpty(cursorRawDataList)) {
-                                    opcAsyncTask.addCursorRawDataList(cursorRawDataList);
-                                    opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index.get());
-                                    cursorRawDataList = new ArrayList<>();
-                                }
-                            } catch (Exception e) {
-                                flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                                if (Blank.isEmpty(flage)) {
-                                    flage = false;
-                                }
-                                if (!flage) {
-                                    //执行组装数据库的数据,以及生成驱动报表
-                                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                                    if (Blank.isNotEmpty(server)) {
-                                        server.dispose();
-                                    }
-                                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                                    cronTaskRegister.removeCronTask(cronId);
-                                    timer.cancel();
+                            }
+                            if (Blank.isNotEmpty(cursorRawDataList)) {
+                                opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                                opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index);
+                                cursorRawDataList = new ArrayList<>();
+                            }
+                        } catch (Exception e) {
+                            flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
+                            }
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
                                 }
+                                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                                cronTaskRegister.removeCronTask(cronId);
+                                timer.cancel();
                             }
                         }
-                    } catch (Exception e) {
-                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                        if (Blank.isEmpty(flage)) {
-                            flage = false;
-                        }
-                        if (!flage) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                            cronTaskRegister.removeCronTask(cronId);
-                            timer.cancel();
+                    }
+                } catch (Exception e) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (!flage) {
+                        //执行组装数据库的数据,以及生成驱动报表
+                        sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                        redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                        if (Blank.isNotEmpty(server)) {
+                            server.dispose();
                         }
+                        itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                        cronTaskRegister.removeCronTask(cronId);
+                        timer.cancel();
                     }
                 }
-            });
-        } catch (Exception e) {
-            String message = OpcDaUtil.genException(e.getMessage());
-            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                    message,
-                    ConstantStr.NO_READ));
-            if (Blank.isNotEmpty(server)) {
-                server.dispose();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
-            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
-            cronTaskRegister.removeCronTask(cronId);
-            timer.cancel();
         }
     }
 }

+ 0 - 281
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask1.java

@@ -1,281 +0,0 @@
-package com.example.opc_da.task;
-
-import com.alibaba.fastjson.JSON;
-import com.example.opc_common.entity.*;
-import com.example.opc_common.util.Blank;
-import com.example.opc_common.util.ConstantStr;
-import com.example.opc_common.util.DateUtil;
-import com.example.opc_common.util.MathUtil;
-import com.example.opc_da.dao.ItemGroupDao;
-import com.example.opc_da.dao.MessageNoticeDao;
-import com.example.opc_da.dynamicSchedule.CronTaskRegister;
-import com.example.opc_da.util.OpcDaUtil;
-import com.example.opc_da.util.RedisUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.jinterop.dcom.common.JIException;
-import org.openscada.opc.dcom.da.OPCSERVERSTATE;
-import org.openscada.opc.lib.da.Group;
-import org.openscada.opc.lib.da.ItemState;
-import org.openscada.opc.lib.da.Server;
-
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
-
-import static com.example.opc_da.util.OpcDaUtil.getVal;
-
-@Slf4j
-public class OpcDaFrequencyTask1 extends TimerTask {
-
-    private final RedisUtil redisUtil;
-
-    private final OpcAsyncTask opcAsyncTask;
-
-    private final String cronId;
-
-    private final CronTaskRegister cronTaskRegister;
-
-    private final ItemGroupDao itemGroupDao;
-
-    private final MessageNoticeDao messageNoticeDao;
-
-    private final Timer timer;
-
-    private final ItemGroup itemGroup;
-
-    private final DataSource dataSource;
-
-    private final Map<String, DataModel> map;
-
-    private final List<Item> itemList;
-
-    private final String[] items;
-
-    private final String timeFormat;
-
-    private final List<TableTemplate> tableTemplates;
-
-    Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap;
-
-    Map<Integer, String> itemReadMap;
-
-    private final Map<Integer, ReportTable> reportTableMap;
-
-    private final Long endTime;
-
-    public OpcDaFrequencyTask1(RedisUtil redisUtil,
-                               OpcAsyncTask opcAsyncTask,
-                               String cronId,
-                               CronTaskRegister cronTaskRegister,
-                               ItemGroupDao itemGroupDao,
-                               MessageNoticeDao messageNoticeDao,
-                               Timer timer,
-                               ItemGroup itemGroup,
-                               DataSource dataSource,
-                               Map<String, DataModel> map,
-                               List<Item> itemList,
-                               String[] items,
-                               String timeFormat,
-                               List<TableTemplate> tableTemplates,
-                               Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap,
-                               Map<Integer, String> itemReadMap,
-                               Map<Integer, ReportTable> reportTableMap,
-                               Long endTime) {
-        this.redisUtil = redisUtil;
-        this.opcAsyncTask = opcAsyncTask;
-        this.cronId = cronId;
-        this.cronTaskRegister = cronTaskRegister;
-        this.itemGroupDao = itemGroupDao;
-        this.messageNoticeDao = messageNoticeDao;
-        this.timer = timer;
-        this.itemGroup = itemGroup;
-        this.dataSource = dataSource;
-        this.map = map;
-        this.itemList = itemList;
-        this.items = items;
-        this.timeFormat = timeFormat;
-        this.tableTemplates = tableTemplates;
-        this.ttIdMap = ttIdMap;
-        this.itemReadMap = itemReadMap;
-        this.reportTableMap = reportTableMap;
-        this.endTime = endTime;
-    }
-
-    @Override
-    public void run() {
-        Server server = OpcDaUtil.createServer(dataSource);
-        Integer id = itemGroup.getId();
-        Integer dataSourceId = dataSource.getId();
-        try {
-            server.connect();
-            AtomicReference<Long> index = new AtomicReference<>(0L);
-            server.addStateListener(connected -> {
-                log.info("-----" + connected);
-                if (!connected) {
-                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                    if (Blank.isEmpty(flage)) {
-                        flage = false;
-                    }
-                    if (flage) {
-                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
-                                "服务断开,马上进行重新连接",
-                                ConstantStr.NO_READ));
-                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                        Timer listenerTimer = new Timer();
-                        listenerTimer.schedule(new TimerTask() {
-                            @Override
-                            public void run() {
-                                try {
-                                    server.connect();
-                                    if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
-                                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
-                                                "服务重新连接成功",
-                                                ConstantStr.NO_READ));
-                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
-                                        listenerTimer.cancel();
-                                    }
-                                } catch (Exception e) {
-
-                                }
-                            }
-                        }, 60000);
-                    }
-                } else {
-                    Group group = null;
-                    String sqlCurrentYmdh = "";
-                    Map<String, org.openscada.opc.lib.da.Item> itemResult = null;
-                    try {
-                        group = server.addGroup();
-                        itemResult = group.addItems(items);
-                    } catch (Exception e) {
-//                        throw new RuntimeException(e);
-                    }
-                    Set itemSet = new HashSet(itemResult.values());
-                    org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
-                    itemSet.toArray(itemArr);
-                    int count = (int) (Math.round(itemGroup.getModeValue() * 1000));
-                    while (true) {
-                        log.info("-----" + index);
-                        try {
-                            Thread.sleep(count);
-                        } catch (InterruptedException e) {
-
-                        }
-                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                        if (Blank.isEmpty(flage)) {
-                            flage = false;
-                        }
-                        if (!flage) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                            if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            }
-                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            cronTaskRegister.removeCronTask(cronId);
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                            timer.cancel();
-                            break;
-                        }
-                        if (System.currentTimeMillis() >= endTime) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                            if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            }
-                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            timer.cancel();
-                            break;
-                        }
-                        Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = null;
-                        try {
-                            resultMap = group.read(true, itemArr);
-                            index.getAndSet(index.get() + 1);
-                        } catch (JIException e) {
-                            throw new RuntimeException(e);
-                        }
-                        List<CursorRawData> cursorRawDataList = new ArrayList<>();
-                        for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
-                            String keyId = key.getId();
-                            ItemState itemMap = resultMap.get(key);
-                            Map<String, Object> val = getVal(itemMap.getValue());
-                            String javaType = val.get("javaType").toString();
-                            Object value = val.get("value");
-                            Date time = itemMap.getTimestamp().getTime();
-                            String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                            DataModel dm = map.get(keyId);
-                            if (Blank.isEmpty(sqlCurrentYmdh)) {
-                                sqlCurrentYmdh = currentYmdh;
-                                redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                            } else {
-                                if (!sqlCurrentYmdh.equals(currentYmdh)) {
-                                    //组装相应的原始数据
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                    sqlCurrentYmdh = currentYmdh;
-                                }
-                            }
-                            if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
-                                String valStr = val.toString();
-                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
-                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                cursorRawDataList.add(cursorRawData);
-                            } else {
-                                if (javaType.toLowerCase().equals("boolean")) {
-                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
-                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                    cursorRawDataList.add(cursorRawData);
-                                } else {
-                                    try {
-                                        BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                        BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
-                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                        cursorRawDataList.add(cursorRawData);
-                                    } catch (Exception e) {
-                                        if (Blank.isNotEmpty(value)) {
-                                            String valStr = value.toString();
-                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
-                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                            cursorRawDataList.add(cursorRawData);
-                                        } else {
-                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
-                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                            cursorRawDataList.add(cursorRawData);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                        if (Blank.isNotEmpty(cursorRawDataList)) {
-                            opcAsyncTask.addCursorRawDataList(cursorRawDataList);
-                            opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index.get());
-                            cursorRawDataList = new ArrayList<>();
-                        }
-                    }
-                }
-            });
-        } catch (Exception e) {
-            String message = OpcDaUtil.genException(e.getMessage());
-            log.info("-----我进入了这个异常,添加了条通知数据");
-            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                    message,
-                    ConstantStr.NO_READ));
-            if (Blank.isNotEmpty(server)) {
-                server.dispose();
-            }
-            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
-            cronTaskRegister.removeCronTask(cronId);
-            timer.cancel();
-        }
-    }
-}

+ 0 - 312
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask2.java

@@ -1,312 +0,0 @@
-package com.example.opc_da.task;
-
-import com.alibaba.fastjson.JSON;
-import com.example.opc_common.entity.*;
-import com.example.opc_common.util.Blank;
-import com.example.opc_common.util.ConstantStr;
-import com.example.opc_common.util.DateUtil;
-import com.example.opc_common.util.MathUtil;
-import com.example.opc_da.dao.ItemGroupDao;
-import com.example.opc_da.dao.MessageNoticeDao;
-import com.example.opc_da.dynamicSchedule.CronTaskRegister;
-import com.example.opc_da.util.OpcDaUtil;
-import com.example.opc_da.util.RedisUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.openscada.opc.dcom.da.OPCSERVERSTATE;
-import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
-import org.openscada.opc.lib.da.Group;
-import org.openscada.opc.lib.da.Item;
-import org.openscada.opc.lib.da.ItemState;
-import org.openscada.opc.lib.da.Server;
-
-import java.math.BigDecimal;
-import java.util.*;
-
-import static com.example.opc_da.util.OpcDaUtil.getVal;
-
-@Slf4j
-public class OpcDaFrequencyTask2 extends TimerTask {
-
-    private final RedisUtil redisUtil;
-
-    private final OpcAsyncTask opcAsyncTask;
-
-    private final String cronId;
-
-    private final CronTaskRegister cronTaskRegister;
-
-    private final ItemGroupDao itemGroupDao;
-
-    private final MessageNoticeDao messageNoticeDao;
-
-    private final Timer timer;
-
-    private final ItemGroup itemGroup;
-
-    private final DataSource dataSource;
-
-    private final Map<String, DataModel> map;
-
-    private final List<com.example.opc_common.entity.Item> itemList;
-
-    private final String[] items;
-
-    private final String timeFormat;
-
-    private final List<TableTemplate> tableTemplates;
-
-    Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap;
-
-    Map<Integer, String> itemReadMap;
-
-    private final Map<Integer, ReportTable> reportTableMap;
-
-    private final Long endTime;
-
-    public OpcDaFrequencyTask2(RedisUtil redisUtil,
-                               OpcAsyncTask opcAsyncTask,
-                               String cronId,
-                               CronTaskRegister cronTaskRegister,
-                               ItemGroupDao itemGroupDao,
-                               MessageNoticeDao messageNoticeDao,
-                               Timer timer,
-                               ItemGroup itemGroup,
-                               DataSource dataSource,
-                               Map<String, DataModel> map,
-                               List<com.example.opc_common.entity.Item> itemList,
-                               String[] items,
-                               String timeFormat,
-                               List<TableTemplate> tableTemplates,
-                               Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap,
-                               Map<Integer, String> itemReadMap,
-                               Map<Integer, ReportTable> reportTableMap,
-                               Long endTime) {
-        this.redisUtil = redisUtil;
-        this.opcAsyncTask = opcAsyncTask;
-        this.cronId = cronId;
-        this.cronTaskRegister = cronTaskRegister;
-        this.itemGroupDao = itemGroupDao;
-        this.messageNoticeDao = messageNoticeDao;
-        this.timer = timer;
-        this.itemGroup = itemGroup;
-        this.dataSource = dataSource;
-        this.map = map;
-        this.itemList = itemList;
-        this.items = items;
-        this.timeFormat = timeFormat;
-        this.tableTemplates = tableTemplates;
-        this.ttIdMap = ttIdMap;
-        this.itemReadMap = itemReadMap;
-        this.reportTableMap = reportTableMap;
-        this.endTime = endTime;
-    }
-
-    @Override
-    public void run() {
-        Server server = OpcDaUtil.createServer(dataSource);
-        Integer id = itemGroup.getId();
-        Integer dataSourceId = dataSource.getId();
-        try {
-            server.connect();
-            server.addStateListener(connected -> {
-                log.info("-----" + connected);
-                if (!connected) {
-                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                    if (Blank.isEmpty(flage)) {
-                        flage = false;
-                    }
-                    if (flage) {
-                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
-                                "服务断开,马上进行重新连接",
-                                ConstantStr.NO_READ));
-                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                        Timer listenerTimer = new Timer();
-                        listenerTimer.schedule(new TimerTask() {
-                            @Override
-                            public void run() {
-                                try {
-                                    server.connect();
-                                    if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
-                                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
-                                                "服务重新连接成功",
-                                                ConstantStr.NO_READ));
-                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
-                                        listenerTimer.cancel();
-                                    }
-                                } catch (Exception e) {
-//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
-//                                String message = OpcDaUtil.genException(e.getMessage());
-//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
-//                                        message,
-//                                        ConstantStr.NO_READ));
-//                                listenerTimer.cancel();
-                                }
-                            }
-                        }, 60000);
-                    }
-                }
-            });
-        } catch (Exception e) {
-            String message = OpcDaUtil.genException(e.getMessage());
-            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                    message,
-                    ConstantStr.NO_READ));
-            if (Blank.isNotEmpty(server)) {
-                server.dispose();
-            }
-            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
-            cronTaskRegister.removeCronTask(cronId);
-            timer.cancel();
-        }
-        try {
-            Group group = server.addGroup();
-            Map<String, Item> itemResult = group.addItems(items);
-            Set itemSet = new HashSet(itemResult.values());
-            Item[] itemArr = new Item[itemSet.size()];
-            itemSet.toArray(itemArr);
-            String sqlCurrentYmdh = "";
-            Long index = 0L;
-            int count = (int) (Math.round(itemGroup.getModeValue() * 1000));
-            while (true) {
-                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                if (Blank.isEmpty(flage)) {
-                    flage = false;
-                }
-                if (!flage) {
-                    //执行组装数据库的数据,以及生成驱动报表
-                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                    if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                    }
-                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                    if (Blank.isNotEmpty(server)) {
-                        server.dispose();
-                    }
-                    cronTaskRegister.removeCronTask(cronId);
-                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                    timer.cancel();
-                    break;
-                }
-                if (System.currentTimeMillis() >= endTime) {
-                    //执行组装数据库的数据,以及生成驱动报表
-                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                    if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                    }
-                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                    if (Blank.isNotEmpty(server)) {
-                        server.dispose();
-                    }
-                    timer.cancel();
-                    break;
-                }
-                try {
-                    Thread.sleep(count);
-                    log.info("-----" + index);
-                    OPCSERVERSTATUS serverState = server.getServerState();
-                    log.info("-----" + serverState);
-                    log.info("-----" + group);
-                    Map<Item, ItemState> resultMap = group.read(true, itemArr);
-                    index++;
-                    List<CursorRawData> cursorRawDataList = new ArrayList<>();
-                    for (Item key : resultMap.keySet()) {
-                        String keyId = key.getId();
-                        ItemState itemMap = resultMap.get(key);
-                        Map<String, Object> val = getVal(itemMap.getValue());
-                        String javaType = val.get("javaType").toString();
-                        Object value = val.get("value");
-                        Date time = itemMap.getTimestamp().getTime();
-                        String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                        String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                        DataModel dm = map.get(keyId);
-                        if (Blank.isEmpty(sqlCurrentYmdh)) {
-                            sqlCurrentYmdh = currentYmdh;
-                            redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                        } else {
-                            if (!sqlCurrentYmdh.equals(currentYmdh)) {
-                                //组装相应的原始数据
-                                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                sqlCurrentYmdh = currentYmdh;
-                            }
-                        }
-                        if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
-                            String valStr = val.toString();
-                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
-                                    currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                            cursorRawDataList.add(cursorRawData);
-                        } else {
-                            if (javaType.toLowerCase().equals("boolean")) {
-                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
-                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                cursorRawDataList.add(cursorRawData);
-                            } else {
-                                try {
-                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                    BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
-                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
-                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                    cursorRawDataList.add(cursorRawData);
-                                } catch (Exception e) {
-                                    if (Blank.isNotEmpty(value)) {
-                                        String valStr = value.toString();
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                        cursorRawDataList.add(cursorRawData);
-                                    } else {
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                        cursorRawDataList.add(cursorRawData);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    if (Blank.isNotEmpty(cursorRawDataList)) {
-                        opcAsyncTask.addCursorRawDataList(cursorRawDataList);
-                        opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index);
-                        cursorRawDataList = new ArrayList<>();
-                    }
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                    if (Blank.isEmpty(flage)) {
-                        flage = false;
-                    }
-                    if (!flage) {
-                        //执行组装数据库的数据,以及生成驱动报表
-                        sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                        redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                        if (Blank.isNotEmpty(server)) {
-                            server.dispose();
-                        }
-                        itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                        cronTaskRegister.removeCronTask(cronId);
-                        timer.cancel();
-                    }
-                }
-            }
-        } catch (Exception e) {
-            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-            if (Blank.isEmpty(flage)) {
-                flage = false;
-            }
-            if (!flage) {
-                //执行组装数据库的数据,以及生成驱动报表
-                String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                if (Blank.isNotEmpty(server)) {
-                    server.dispose();
-                }
-                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                cronTaskRegister.removeCronTask(cronId);
-                timer.cancel();
-            }
-        }
-    }
-}

+ 290 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask5.java

@@ -0,0 +1,290 @@
+package com.example.opc_da.task;
+
+import com.alibaba.fastjson.JSON;
+import com.example.opc_common.entity.*;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_common.util.DateUtil;
+import com.example.opc_common.util.MathUtil;
+import com.example.opc_da.dao.ItemGroupDao;
+import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dynamicSchedule.CronTaskRegister;
+import com.example.opc_da.util.OpcDaUtil;
+import com.example.opc_da.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.openscada.opc.dcom.da.OPCSERVERSTATUS;
+import org.openscada.opc.lib.da.*;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static com.example.opc_da.util.OpcDaUtil.getVal;
+
+@Slf4j
+public class OpcDaFrequencyTask5 extends TimerTask {
+
+    private final RedisUtil redisUtil;
+
+    private final OpcAsyncTask opcAsyncTask;
+
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
+    private final ItemGroupDao itemGroupDao;
+
+    private final MessageNoticeDao messageNoticeDao;
+
+    private final Timer timer;
+
+    private final ItemGroup itemGroup;
+
+    private final DataSource dataSource;
+
+    private final Map<String, DataModel> map;
+
+    private final List<com.example.opc_common.entity.Item> itemList;
+
+    private final String[] items;
+
+    private final String timeFormat;
+
+    private final List<TableTemplate> tableTemplates;
+
+    Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap;
+
+    Map<Integer, String> itemReadMap;
+
+    private final Map<Integer, ReportTable> reportTableMap;
+
+    private final Long endTime;
+
+    public OpcDaFrequencyTask5(RedisUtil redisUtil,
+                               OpcAsyncTask opcAsyncTask,
+                               String cronId,
+                               CronTaskRegister cronTaskRegister,
+                               ItemGroupDao itemGroupDao,
+                               MessageNoticeDao messageNoticeDao,
+                               Timer timer,
+                               ItemGroup itemGroup,
+                               DataSource dataSource,
+                               Map<String, DataModel> map,
+                               List<com.example.opc_common.entity.Item> itemList,
+                               String[] items,
+                               String timeFormat,
+                               List<TableTemplate> tableTemplates,
+                               Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap,
+                               Map<Integer, String> itemReadMap,
+                               Map<Integer, ReportTable> reportTableMap,
+                               Long endTime) {
+        this.redisUtil = redisUtil;
+        this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
+        this.itemGroupDao = itemGroupDao;
+        this.messageNoticeDao = messageNoticeDao;
+        this.timer = timer;
+        this.itemGroup = itemGroup;
+        this.dataSource = dataSource;
+        this.map = map;
+        this.itemList = itemList;
+        this.items = items;
+        this.timeFormat = timeFormat;
+        this.tableTemplates = tableTemplates;
+        this.ttIdMap = ttIdMap;
+        this.itemReadMap = itemReadMap;
+        this.reportTableMap = reportTableMap;
+        this.endTime = endTime;
+    }
+
+    @Override
+    public void run() {
+        Integer id = itemGroup.getId();
+        Integer dataSourceId = dataSource.getId();
+        Server server = OpcDaUtil.createServer(dataSource);
+        AtomicReference<Long> index = new AtomicReference<>(0L);
+        AutoReconnectController autoReconnectController = new AutoReconnectController(server);
+        autoReconnectController.addListener(new AutoReconnectListener() {
+            @Override
+            public void stateChanged(AutoReconnectState state) {
+                if (state.equals(AutoReconnectState.CONNECTED)) {
+                    if (index.get() != 0) {
+                        log.info("-----" + "重连成功");
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                "服务重新连接成功",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                    }
+                    try {
+                        Group group = server.addGroup();
+                        Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
+                        Set itemSet = new HashSet(itemResult.values());
+                        org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
+                        itemSet.toArray(itemArr);
+                        String sqlCurrentYmdh = "";
+                        int count = (int) (Math.round(itemGroup.getModeValue() * 1000));
+                        while (true) {
+                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
+                            }
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                }
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                cronTaskRegister.removeCronTask(cronId);
+                                redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                                timer.cancel();
+                                break;
+                            }
+                            if (System.currentTimeMillis() >= endTime) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                }
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                timer.cancel();
+                                break;
+                            }
+                            try {
+                                Thread.sleep(count);
+                                OPCSERVERSTATUS serverState = server.getServerState();
+                                if (Blank.isEmpty(serverState)) {
+                                    break;
+                                }
+                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                                index.getAndSet(index.get() + 1);
+                                log.info("-----" + index);
+                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                                for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
+                                    String keyId = key.getId();
+                                    ItemState itemMap = resultMap.get(key);
+                                    Map<String, Object> val = getVal(itemMap.getValue());
+                                    String javaType = val.get("javaType").toString();
+                                    Object value = val.get("value");
+                                    Date time = itemMap.getTimestamp().getTime();
+                                    String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                                    String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                                    DataModel dm = map.get(keyId);
+                                    if (Blank.isEmpty(sqlCurrentYmdh)) {
+                                        sqlCurrentYmdh = currentYmdh;
+                                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                                    } else {
+                                        if (!sqlCurrentYmdh.equals(currentYmdh)) {
+                                            //组装相应的原始数据
+                                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                            sqlCurrentYmdh = currentYmdh;
+                                        }
+                                    }
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                                        String valStr = val.toString();
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    } else {
+                                        if (javaType.toLowerCase().equals("boolean")) {
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
+                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                            cursorRawDataList.add(cursorRawData);
+                                        } else {
+                                            try {
+                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
+                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                cursorRawDataList.add(cursorRawData);
+                                            } catch (Exception e) {
+                                                if (Blank.isNotEmpty(value)) {
+                                                    String valStr = value.toString();
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
+                                                } else {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                                if (Blank.isNotEmpty(cursorRawDataList)) {
+                                    opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                                    opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index.get());
+                                    cursorRawDataList = new ArrayList<>();
+                                }
+                            } catch (Exception e) {
+                                flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                                if (Blank.isEmpty(flage)) {
+                                    flage = false;
+                                }
+                                if (!flage) {
+                                    //执行组装数据库的数据,以及生成驱动报表
+                                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                    if (Blank.isNotEmpty(server)) {
+                                        server.dispose();
+                                    }
+                                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                                    cronTaskRegister.removeCronTask(cronId);
+                                    timer.cancel();
+                                }
+                            }
+                        }
+                    } catch (Exception e) {
+                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                        if (Blank.isEmpty(flage)) {
+                            flage = false;
+                        }
+                        if (!flage) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                            cronTaskRegister.removeCronTask(cronId);
+                            timer.cancel();
+                        }
+                    }
+                } else {
+                    log.info("-----" + "服务断开,准备重连"+index.get());
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (flage) {
+                        if (index.get() != 0) {
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                    "服务断开,马上进行重新连接",
+                                    ConstantStr.NO_READ));
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        }
+                    }
+                }
+            }
+        });
+        try {
+            server.connect();
+        } catch (Exception e) {
+
+        }
+        autoReconnectController.connect();
+    }
+}

+ 149 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask6.java

@@ -0,0 +1,149 @@
+package com.example.opc_da.task;
+
+import com.example.opc_common.entity.*;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_common.util.DateUtil;
+import com.example.opc_da.dao.ItemGroupDao;
+import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dynamicSchedule.CronTaskRegister;
+import com.example.opc_da.util.OpcDaUtil;
+import com.example.opc_da.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.openscada.opc.lib.da.AutoReconnectController;
+import org.openscada.opc.lib.da.AutoReconnectListener;
+import org.openscada.opc.lib.da.AutoReconnectState;
+import org.openscada.opc.lib.da.Server;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+@Slf4j
+public class OpcDaFrequencyTask6 extends TimerTask {
+
+    private final RedisUtil redisUtil;
+
+     static AutoReconnectState status;
+
+    private final OpcAsyncTask opcAsyncTask;
+
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
+    private final ItemGroupDao itemGroupDao;
+
+    private final MessageNoticeDao messageNoticeDao;
+
+    private final Timer timer;
+
+    private final ItemGroup itemGroup;
+
+    private final DataSource dataSource;
+
+    private final Map<String, DataModel> map;
+
+    private final List<Item> itemList;
+
+    private final String[] items;
+
+    private final String timeFormat;
+
+    private final List<TableTemplate> tableTemplates;
+
+    Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap;
+
+    Map<Integer, String> itemReadMap;
+
+    private final Map<Integer, ReportTable> reportTableMap;
+
+    private final Long endTime;
+
+    public OpcDaFrequencyTask6(RedisUtil redisUtil,
+                               OpcAsyncTask opcAsyncTask,
+                               String cronId,
+                               CronTaskRegister cronTaskRegister,
+                               ItemGroupDao itemGroupDao,
+                               MessageNoticeDao messageNoticeDao,
+                               Timer timer,
+                               ItemGroup itemGroup,
+                               DataSource dataSource,
+                               Map<String, DataModel> map,
+                               List<Item> itemList,
+                               String[] items,
+                               String timeFormat,
+                               List<TableTemplate> tableTemplates,
+                               Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap,
+                               Map<Integer, String> itemReadMap,
+                               Map<Integer, ReportTable> reportTableMap,
+                               Long endTime) {
+        this.redisUtil = redisUtil;
+        this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
+        this.itemGroupDao = itemGroupDao;
+        this.messageNoticeDao = messageNoticeDao;
+        this.timer = timer;
+        this.itemGroup = itemGroup;
+        this.dataSource = dataSource;
+        this.map = map;
+        this.itemList = itemList;
+        this.items = items;
+        this.timeFormat = timeFormat;
+        this.tableTemplates = tableTemplates;
+        this.ttIdMap = ttIdMap;
+        this.itemReadMap = itemReadMap;
+        this.reportTableMap = reportTableMap;
+        this.endTime = endTime;
+    }
+
+    @Override
+    public void run() {
+        Integer id = itemGroup.getId();
+        Integer dataSourceId = dataSource.getId();
+        Server server = OpcDaUtil.createServer(dataSource);
+        AtomicReference<Long> index = new AtomicReference<>(0L);
+        AutoReconnectController autoReconnectController = new AutoReconnectController(server);
+        autoReconnectController.addListener(new AutoReconnectListener() {
+            @Override
+            public void stateChanged(AutoReconnectState state) {
+                status = state;
+                log.info("-----" + state);
+                if (state.equals(AutoReconnectState.CONNECTED)) {
+                    if (index.get() != 0) {
+                        log.info("-----" + "重连成功");
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                "服务重新连接成功",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                    }
+
+                } else {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (flage) {
+                        if (index.get() != 0) {
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                    "服务断开,马上进行重新连接",
+                                    ConstantStr.NO_READ));
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        }
+                    }
+                }
+            }
+        });
+        try {
+            server.connect();
+        } catch (Exception e) {
+
+        }
+        autoReconnectController.connect();
+        while (true){
+            System.out.println(status);
+        }
+    }
+}