|
@@ -12,6 +12,7 @@ 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.lib.da.Item;
|
|
|
import org.openscada.opc.lib.da.*;
|
|
|
|
|
@@ -80,9 +81,67 @@ public class OpcDaFrequencyTask extends TimerTask {
|
|
|
Server server = OpcDaUtil.createServer(dataSource);
|
|
|
Integer id = itemGroup.getId();
|
|
|
Integer dataSourceId = dataSource.getId();
|
|
|
+ SyncAccess access = null;
|
|
|
try {
|
|
|
server.connect();
|
|
|
- SyncAccess access = new SyncAccess(server, (int) (Math.round(itemGroup.getModeValue() * 1000)));
|
|
|
+ server.addStateListener(connected -> {
|
|
|
+ if (!connected) {
|
|
|
+ messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
|
|
|
+ itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
|
|
|
+ "服务断开,马山进行重新连接",
|
|
|
+ ConstantStr.NO_READ));
|
|
|
+ Timer listenerTimer = new Timer();
|
|
|
+ listenerTimer.schedule(new TimerTask() {
|
|
|
+ private int sum = 0;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ try {
|
|
|
+ sum++;
|
|
|
+ if (sum > 3) {
|
|
|
+ redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
|
|
|
+ messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
|
|
|
+ itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
|
|
|
+ "3次服务重新连接失败",
|
|
|
+ ConstantStr.NO_READ));
|
|
|
+ listenerTimer.cancel();
|
|
|
+ }
|
|
|
+ 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));
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, 10000);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } 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 {
|
|
|
+ access = new SyncAccess(server, (int) (Math.round(itemGroup.getModeValue() * 1000)));
|
|
|
// AccessBase access = new Async20Access(server, (int) (itemGroup.getModeValue() * 1000), true);
|
|
|
for (com.example.opc_common.entity.Item item : itemList) {
|
|
|
String itemId = item.getItemReadName();
|
|
@@ -172,6 +231,9 @@ public class OpcDaFrequencyTask extends TimerTask {
|
|
|
itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
|
|
|
"服务异常停止了",
|
|
|
ConstantStr.NO_READ));
|
|
|
+ if (Blank.isNotEmpty(access)) {
|
|
|
+ access.clear();
|
|
|
+ }
|
|
|
if (Blank.isNotEmpty(server)) {
|
|
|
server.dispose();
|
|
|
}
|
|
@@ -186,7 +248,9 @@ public class OpcDaFrequencyTask extends TimerTask {
|
|
|
String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
|
|
|
opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
|
|
|
redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
|
|
|
- access.unbind();
|
|
|
+ if (Blank.isNotEmpty(access)) {
|
|
|
+ access.clear();
|
|
|
+ }
|
|
|
if (Blank.isNotEmpty(server)) {
|
|
|
server.dispose();
|
|
|
}
|
|
@@ -201,7 +265,9 @@ public class OpcDaFrequencyTask extends TimerTask {
|
|
|
opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
|
|
|
redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
|
|
|
|
|
|
- access.unbind();
|
|
|
+ if (Blank.isNotEmpty(access)) {
|
|
|
+ access.clear();
|
|
|
+ }
|
|
|
if (Blank.isNotEmpty(server)) {
|
|
|
server.dispose();
|
|
|
}
|
|
@@ -210,18 +276,30 @@ public class OpcDaFrequencyTask extends TimerTask {
|
|
|
}
|
|
|
}
|
|
|
} 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();
|
|
|
+ try {
|
|
|
+ Thread.sleep(30000);
|
|
|
+ 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(access)) {
|
|
|
+ access.clear();
|
|
|
+ }
|
|
|
+ if (Blank.isNotEmpty(server)) {
|
|
|
+ server.dispose();
|
|
|
+ }
|
|
|
+ itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
|
|
|
+ cronTaskRegister.removeCronTask(cronId);
|
|
|
+ timer.cancel();
|
|
|
+ }
|
|
|
+ } catch (Exception ex) {
|
|
|
+ ex.printStackTrace();
|
|
|
}
|
|
|
- itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
|
|
|
- cronTaskRegister.removeCronTask(cronId);
|
|
|
- redisUtil.del(ConstantStr.ITEM_GROUP + id);
|
|
|
- timer.cancel();
|
|
|
}
|
|
|
}
|
|
|
}
|