feat: 拆分服务和采集,开机自动启动服务和采集

dev
huangfeng 8 months ago
parent ff37dd5c31
commit eb04d0ce89

@ -4,6 +4,7 @@ import com.xydl.cac.entity.IcdConfigType;
import com.xydl.cac.entity.IcdFile; import com.xydl.cac.entity.IcdFile;
import com.xydl.cac.entity.IcdIed; import com.xydl.cac.entity.IcdIed;
import com.xydl.cac.exception.BusinessException; import com.xydl.cac.exception.BusinessException;
import com.xydl.cac.iec.RealTimeDataService;
import com.xydl.cac.model.ColumnModel; import com.xydl.cac.model.ColumnModel;
import com.xydl.cac.model.IcdAttUpdateModel; import com.xydl.cac.model.IcdAttUpdateModel;
import com.xydl.cac.model.Response; import com.xydl.cac.model.Response;
@ -32,6 +33,8 @@ public class IcdConfigController extends BasicController {
IcdFileConfigService configService; IcdFileConfigService configService;
@Resource @Resource
DataService dataService; DataService dataService;
@Resource
RealTimeDataService realTimeDataService;
@PostMapping("upload") @PostMapping("upload")
@ApiOperation("上传客户端icd文件") @ApiOperation("上传客户端icd文件")
@ -139,4 +142,25 @@ public class IcdConfigController extends BasicController {
return Response.success("OK"); return Response.success("OK");
} }
@PostMapping("startCollect")
@ApiOperation("开始实时采集转发")
public Response<String> startCollect(@Validated @NotNull(message = "iedId不能为空!") Integer iedId) throws Exception {
if (RealTimeDataService.inDoing) {
throw new BusinessException("请稍后再操作");
}
realTimeDataService.startCollect(iedId);
return Response.success("OK");
}
@PostMapping("stopCollect")
@ApiOperation("停止实时采集转发")
public Response<String> stopCollect(@Validated @NotNull(message = "iedId不能为空!") Integer iedId) throws Exception {
if (RealTimeDataService.inDoing) {
throw new BusinessException("请稍后再操作");
}
realTimeDataService.stopCollect(iedId);
return Response.success("OK");
}
} }

@ -1,9 +1,7 @@
package com.xydl.cac.controller; package com.xydl.cac.controller;
import com.xydl.cac.entity.IcdFile; import com.xydl.cac.entity.IcdFile;
import com.xydl.cac.exception.BusinessException;
import com.xydl.cac.iec.IecServerService; import com.xydl.cac.iec.IecServerService;
import com.xydl.cac.iec.RealTimeDataService;
import com.xydl.cac.model.Response; import com.xydl.cac.model.Response;
import com.xydl.cac.service.IcdFileConfigService; import com.xydl.cac.service.IcdFileConfigService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@ -30,8 +28,6 @@ public class IecServerController extends BasicController {
IcdFileConfigService configService; IcdFileConfigService configService;
@Resource @Resource
IecServerService iecServerService; IecServerService iecServerService;
@Resource
RealTimeDataService realTimeDataService;
@PostMapping("upload") @PostMapping("upload")
@ApiOperation("上传服务端icd文件") @ApiOperation("上传服务端icd文件")
@ -59,22 +55,14 @@ public class IecServerController extends BasicController {
@PostMapping("start") @PostMapping("start")
@ApiOperation("启动IEC服务端") @ApiOperation("启动IEC服务端")
public Response<String> start(@Validated @NotNull(message = "fileId不能为空!") Integer fileId) throws Exception { public Response<String> start(@Validated @NotNull(message = "fileId不能为空!") Integer fileId) throws Exception {
if (RealTimeDataService.inDoing) {
throw new BusinessException("请稍后再操作");
}
iecServerService.startServer(fileId); iecServerService.startServer(fileId);
realTimeDataService.start();
return Response.success("OK"); return Response.success("OK");
} }
@PostMapping("stop") @PostMapping("stop")
@ApiOperation("停止IEC服务端") @ApiOperation("停止IEC服务端")
public Response<String> stop() throws Exception { public Response<String> stop() throws Exception {
if (RealTimeDataService.inDoing) { iecServerService.stopServer();
throw new BusinessException("请稍后再操作");
}
realTimeDataService.stop();
iecServerService.stop();
return Response.success("OK"); return Response.success("OK");
} }
@ -84,4 +72,5 @@ public class IecServerController extends BasicController {
HashMap<String, Object> map = iecServerService.status(); HashMap<String, Object> map = iecServerService.status();
return Response.success(map); return Response.success(map);
} }
} }

@ -36,7 +36,6 @@ public class IecServer implements ServerEventListener {
log.info("已停止IEC61850服务端."); log.info("已停止IEC61850服务端.");
} }
started = false; started = false;
filename = null;
} }
public void updateBda(BasicDataAttribute bda) { public void updateBda(BasicDataAttribute bda) {

@ -5,10 +5,13 @@ import com.xydl.cac.exception.BusinessException;
import com.xydl.cac.repository.IcdFileRepository; import com.xydl.cac.repository.IcdFileRepository;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Optional; import java.util.Optional;
@Service @Service
@ -20,6 +23,18 @@ public class IecServerService {
IecServer iecServer = new IecServer(); IecServer iecServer = new IecServer();
@PostConstruct
private void init() {
List<IcdFile> list = fileRepository.findBySrvAndStart(1, 1);
if (!CollectionUtils.isEmpty(list)) {
IcdFile icdFile = list.get(0);
try {
this.startServer(icdFile.getId());
} catch (Exception ignore) {
}
}
}
public void startServer(Integer fileId) throws BusinessException { public void startServer(Integer fileId) throws BusinessException {
Optional<IcdFile> optional = fileRepository.findById(fileId); Optional<IcdFile> optional = fileRepository.findById(fileId);
if (!optional.isPresent()) { if (!optional.isPresent()) {
@ -34,18 +49,30 @@ public class IecServerService {
iecServer.filename = icdFile.getFilename(); iecServer.filename = icdFile.getFilename();
iecServer.fileId = icdFile.getId(); iecServer.fileId = icdFile.getId();
RealTimeDataService.iecServer = iecServer; RealTimeDataService.iecServer = iecServer;
icdFile.setStart(1);
fileRepository.save(icdFile);
} catch (Exception e) { } catch (Exception e) {
log.error("启动IEC61850服务端异常.", e); log.error("启动IEC61850服务端异常.", e);
} }
} }
public void stopServer() {
this.stop();
if (iecServer.fileId != null) {
Optional<IcdFile> optional = fileRepository.findById(iecServer.fileId);
if (optional.isPresent()) {
IcdFile icdFile = optional.get();
icdFile.setStart(0);
fileRepository.save(icdFile);
}
}
}
@PreDestroy @PreDestroy
public void stop() { private void stop() {
RealTimeDataService.iecServer = null; RealTimeDataService.iecServer = null;
if (iecServer != null) {
iecServer.close(); iecServer.close();
} }
}
public HashMap<String, Object> status() { public HashMap<String, Object> status() {
HashMap<String, Object> map = new HashMap<>(); HashMap<String, Object> map = new HashMap<>();

@ -3,17 +3,20 @@ package com.xydl.cac.iec;
import com.beanit.iec61850bean.*; import com.beanit.iec61850bean.*;
import com.xydl.cac.entity.IcdFile; import com.xydl.cac.entity.IcdFile;
import com.xydl.cac.entity.IcdIed; import com.xydl.cac.entity.IcdIed;
import com.xydl.cac.exception.BusinessException;
import com.xydl.cac.repository.IcdFileRepository; import com.xydl.cac.repository.IcdFileRepository;
import com.xydl.cac.repository.IcdIedRepository; import com.xydl.cac.repository.IcdIedRepository;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Optional;
@Service @Service
@Slf4j @Slf4j
@ -26,38 +29,67 @@ public class RealTimeDataService {
public static HashMap<String, String> dataMap = new HashMap<>(); public static HashMap<String, String> dataMap = new HashMap<>();
public static IecServer iecServer = null; public static IecServer iecServer = null;
public static boolean inDoing = false; public static boolean inDoing = false;
HashMap<String, IecClient> clientMap = new HashMap<>(); HashMap<Integer, IecClient> clientMap = new HashMap<>();
public void start() { @PostConstruct
private void init() {
List<IcdIed> list = iedRepository.findByStart(1);
if (!CollectionUtils.isEmpty(list)) {
for (IcdIed ied : list) {
try {
this.startCollect(ied.getId());
} catch (Exception ignore) {
}
}
}
}
public void startCollect(Integer iedId) throws BusinessException {
inDoing = true; inDoing = true;
List<IcdFile> icdFileList = fileRepository.findAll(); Optional<IcdIed> optional = iedRepository.findById(iedId);
if (CollectionUtils.isEmpty(icdFileList)) { if (!optional.isPresent()) {
return; throw new BusinessException("未找到该IED");
} }
for (IcdFile icdFile : icdFileList) { IcdIed ied = optional.get();
List<IcdIed> iedList = iedRepository.findByIcdFileId(icdFile.getId()); Optional<IcdFile> optionalFile = fileRepository.findById(ied.getIcdFileId());
if (!CollectionUtils.isEmpty(iedList)) { if (!optionalFile.isPresent()) {
for (IcdIed ied : iedList) { throw new BusinessException("未找到该icd文件");
}
IcdFile icdFile = optionalFile.get();
try { try {
IecClient iecClient = new IecClient(); IecClient iecClient = new IecClient();
iecClient.connect(ied.getIp(), 102, ied.getApTitle(), icdFile.getXml()); iecClient.connect(ied.getIp(), 102, ied.getApTitle(), icdFile.getXml());
iecClient.enableReporting(); iecClient.enableReporting();
log.info("61850订阅成功, ied=" + ied.getName() + ", ip=" + ied.getIp()); log.info("61850订阅成功, ied=" + ied.getName() + ", ip=" + ied.getIp());
clientMap.put(ied.getIp(), iecClient); ied.setStart(1);
iedRepository.save(ied);
clientMap.put(ied.getId(), iecClient);
} catch (Exception ex) { } catch (Exception ex) {
log.error("61850订阅异常, ied=" + ied.getName() + ", ip=" + ied.getIp(), ex); log.error("61850订阅异常, ied=" + ied.getName() + ", ip=" + ied.getIp(), ex);
} }
inDoing = false;
} }
public void stopCollect(Integer iedId) {
IecClient iecClient = clientMap.get(iedId);
if (iecClient != null) {
iecClient.disableReporting();
iecClient.disconnect();
clientMap.remove(iedId);
} }
Optional<IcdIed> optional = iedRepository.findById(iedId);
if (optional.isPresent()) {
IcdIed ied = optional.get();
ied.setStart(0);
iedRepository.save(ied);
} }
inDoing = false;
} }
@PreDestroy @PreDestroy
public void stop() { private void stop() {
Iterator<String> it = clientMap.keySet().iterator(); Iterator<Integer> it = clientMap.keySet().iterator();
while (it.hasNext()) { while (it.hasNext()) {
String key = it.next(); Integer key = it.next();
IecClient iecClient = clientMap.get(key); IecClient iecClient = clientMap.get(key);
iecClient.disableReporting(); iecClient.disableReporting();
iecClient.disconnect(); iecClient.disconnect();

@ -12,4 +12,6 @@ import java.util.List;
public interface IcdIedRepository extends JpaRepository<IcdIed, Integer>, JpaSpecificationExecutor<IcdIed> { public interface IcdIedRepository extends JpaRepository<IcdIed, Integer>, JpaSpecificationExecutor<IcdIed> {
List<IcdIed> findByIcdFileId(Integer fileId); List<IcdIed> findByIcdFileId(Integer fileId);
List<IcdIed> findByStart(Integer start);
} }
Loading…
Cancel
Save