Browse Source

fix: db connection pool 에러로 인한 수정

- history를 매건마다 보내는것이 아니라 2초마다 한번에 처리
  > front에서 history가져올때 websocket에서는 데이터를 받으나 kac-app에서는 history조회가 안될 수 있음(2초 딜레이될 수 있음)
- log info > debug로 수정
feature/socket
지대한 7 months ago
parent
commit
8b576a31d1
  1. 5
      .gitignore
  2. 2
      app/kac-app/build.gradle
  3. 15
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java
  4. 10
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java
  5. 2
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/exception/ServerExceptionHandler.java
  6. 7
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java
  7. 1
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/web/BaseAcceptHeaderLocaleResolver.java
  8. 14
      app/kac-app/src/main/java/kr/co/palnet/kac/app/ping/controller/TestErrorContoller.java
  9. 12
      app/kac-app/src/main/java/kr/co/palnet/kac/app/ping/controller/TestSessionContrller.java
  10. 60
      app/kac-app/src/main/resources/application.yml
  11. 1967
      app/kac-app/src/main/resources/static/docs/index.html
  12. 46
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java
  13. 51
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java
  14. 54
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java
  15. 2
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/config/AppReadyEvent.java
  16. 8
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/config/NettyConfig.java
  17. 2
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java
  18. 4
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/UtmDto.java
  19. 2
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java
  20. 4
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/SocketServer.java
  21. 23
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneCacheStorage.java
  22. 46
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneStorage.java
  23. 1
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ExternalService.java
  24. 24
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java
  25. 61
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java
  26. 3
      app/kac-socket-app/src/main/resources/application.yml
  27. 2
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java
  28. 2
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Decoder.java
  29. 2
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java
  30. 2
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/config/AppReadyEvent.java
  31. 8
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/config/NettyConfig.java
  32. 12
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/handler/WebSocketHandler.java
  33. 4
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/socket/ChannelInitializer.java
  34. 4
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/socket/WebSocketServer.java
  35. 2
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java
  36. 4
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java
  37. 5
      app/kac-websocket-app/src/main/resources/application.yml
  38. 6
      common/config-db/src/main/resources/application-db.yml
  39. 18
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/ControlDto.java
  40. 8
      common/util/src/main/java/kr/co/palnet/kac/util/EncryptUtil.java
  41. 22
      data/com/src/test/java/kr/co/palnet/kac/data/com/service/ComCodeDomainServiceTest.java
  42. 4
      data/pty/src/test/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainServiceTest.java
  43. 8
      socket-test/pav-100-dron.js
  44. 2
      socket-test/pav-client.js

5
.gitignore vendored

@ -38,3 +38,8 @@ out/
/db/
.DS_Store
**/.DS_Store
### logs ###
logs/
logs/**

2
app/kac-app/build.gradle

@ -48,6 +48,8 @@ dependencies {
// implementation project(":data:com")
// implementation project(":data:other")
// implementation project(":data:pty")
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
ext {

15
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java

@ -8,6 +8,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Slf4j
@RequiredArgsConstructor
@RestController
@ -29,7 +32,17 @@ public class InnerSocketController {
@PostMapping("/receiver/drone")
public ResponseEntity<Void> receiverDronData(@RequestBody DroneDto droneDto) {
log.debug(">>>>> receiver <<<<<");
innerSocketService.setDronData(droneDto);
innerSocketService.saveDronData(droneDto);
return ResponseEntity.ok().build();
}
// dron 정보 저장(전체)
@PostMapping("/receiver/drone/all")
public ResponseEntity<Void> receiverDronDataAll(@RequestBody Map<String, List<DroneDto>> droneDtoAll) {
log.debug(">>>>> receiver all <<<<<");
log.debug(">>>>> data : {}", droneDtoAll);
innerSocketService.saveDronDataAll(droneDtoAll);
return ResponseEntity.ok().build();
}

10
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java

@ -57,7 +57,7 @@ public class InnerSocketService {
if (latestHistory != null) {
long diffMinute = ChronoUnit.MINUTES.between(latestHistory.getSrvrRcvDt(), Instant.now());
// log.info("DIFF MINUTE : {}", diffMinute);
// log.debug("DIFF MINUTE : {}", diffMinute);
if ("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) {
isControl = false;
@ -94,7 +94,7 @@ public class InnerSocketService {
}
// socket으로부터 받은 dron 정보 저장
public void setDronData(DroneDto droneDto) {
public void saveDronData(DroneDto droneDto) {
// 비행 이력 기본 생성
CtrCntrlBas ctrCntrlBas = ctrCntrlBasRepository.findById(droneDto.getControlId()).orElse(null);
@ -299,4 +299,10 @@ public class InnerSocketService {
return distanceList.stream().mapToDouble(Double::doubleValue).sum();
}
public void saveDronDataAll(Map<String, List<DroneDto>> droneDtoAll) {
droneDtoAll.values().forEach(droneDtoList -> {
droneDtoList.forEach(this::saveDronData);
});
}
}

2
app/kac-app/src/main/java/kr/co/palnet/kac/app/core/exception/ServerExceptionHandler.java

@ -119,7 +119,7 @@ public class ServerExceptionHandler {
log.warn("", e);
break;
case ERROR:
log.trace("message: {}, params: {}, trace: ", message, paramArray, e);
log.error("message: {}, params: {}, trace: ", message, paramArray, e);
log.error("", e);
break;
default:

7
app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java

@ -5,13 +5,9 @@ import kr.co.palnet.kac.config.security.exception.BaseAccessDeniedHandler;
import kr.co.palnet.kac.config.security.exception.BaseAuthenticationEntryPoint;
import kr.co.palnet.kac.config.security.service.BaseUserDetailsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.web.SecurityFilterChain;
import java.util.ArrayList;
@ -26,9 +22,10 @@ public class AppSecurityConfig extends SecurityConfig {
// 시큐리티 적용 안하는 URL 목록
private final String[] IGNORE_URL = {
"/test/**",
"/v1/inner/socket/**",
"/v1/com/code/**",
"/actuator/**",
"/test/**",
};
// 권한(ROLE)별 URL

1
app/kac-app/src/main/java/kr/co/palnet/kac/app/core/web/BaseAcceptHeaderLocaleResolver.java

@ -2,7 +2,6 @@ package kr.co.palnet.kac.app.core.web;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;

14
app/kac-app/src/main/java/kr/co/palnet/kac/app/ping/controller/TestErrorContoller.java

@ -37,19 +37,19 @@ public class TestErrorContoller {
@GetMapping("/encrypt/{plainText}")
public String ecrypt(@PathVariable String plainText) {
String encrypt = KisaEncryptUtil.CbcEncrypt.encrypt(plainText);
log.info("e : {}", encrypt);
log.debug("e : {}", encrypt);
String decrypt = KisaEncryptUtil.CbcEncrypt.decrypt(encrypt);
log.info("d : {}", decrypt);
log.debug("d : {}", decrypt);
String encrypt1 = EncryptUtil.encrypt(plainText);
log.info("e : {}", encrypt1);
log.debug("e : {}", encrypt1);
String decrypt1 = EncryptUtil.decrypt(encrypt1);
log.info("d : {}", decrypt1);
log.debug("d : {}", decrypt1);
return decrypt;
}
@GetMapping("/error/{caseNumber}")
public String errorTest(@PathVariable("caseNumber") Integer caseNumber) throws Exception {
log.info("{}", caseNumber);
log.debug("{}", caseNumber);
return switch (caseNumber) {
case 1 -> throw new BaseException(BaseErrorCode.IO_ERROR);
case 2 -> throw new Exception("test");
@ -95,7 +95,7 @@ public class TestErrorContoller {
log.error("{}", e.getMessage());
}
log.info("==========================================================================================");
log.debug("==========================================================================================");
try {
String df = errorMessageSourceAccessor.getMessage("TEST001");
map.put("df", df);
@ -126,6 +126,6 @@ public class TestErrorContoller {
} catch (Exception e) {
log.error("{}", e.getMessage());
}
log.info("{}", map);
log.debug("{}", map);
}
}

12
app/kac-app/src/main/java/kr/co/palnet/kac/app/ping/controller/TestSessionContrller.java

@ -15,17 +15,17 @@ public class TestSessionContrller {
@GetMapping("/auth")
public void test() {
BaseUserDetails userInfo = SessionHelper.getUserInfo();
log.info("userInfo ::: {}", userInfo);
log.debug("userInfo ::: {}", userInfo);
Long userNo = SessionHelper.getCstmrSno();
log.info("userNo ::: {}", userNo);
log.debug("userNo ::: {}", userNo);
String userId = SessionHelper.getUserId();
log.info("userId ::: {}", userId);
log.debug("userId ::: {}", userId);
boolean isRole1 = SessionHelper.hasRole("USER");
log.info("isRole1 ::: {}", isRole1);
log.debug("isRole1 ::: {}", isRole1);
boolean isRole2 = SessionHelper.hasRole("ADMIN");
log.info("isRole2 ::: {}", isRole2);
log.debug("isRole2 ::: {}", isRole2);
boolean isRole3 = SessionHelper.hasRole("ADMINasdfasdf");
log.info("isRole3 ::: {}", isRole3);
log.debug("isRole3 ::: {}", isRole3);
}
}

60
app/kac-app/src/main/resources/application.yml

@ -12,16 +12,68 @@ server.port: 8000
logging:
level:
kr.co.palnet: DEBUG
com.com.zaxxer.hikari: INFO
management:
endpoints:
web:
exposure:
include: '*'
---
spring:
config:
activate:
on-profile: local
logging:
level:
kr.co.palnet: DEBUG
jdbc:
audit: OFF
resultset: OFF
resultsettable: INFO #SQL 결과 데이터 Table을 로그로 남긴다.
sqlonly: OFF #SQL만 로그로 남긴다.
sqltiming: INFO #SQL과 소요시간을 표기한다.
connection : OFF # 커넥션 확인가능
sqltiming: info #SQL과 소요시간을 표기한다.
connection : trace # 커넥션 확인가능
org.hibernate:
SQL: DEBUG
SQL: off
type.descriptor.sql.BasicBinder: TRACE
com.zaxxer.hikari.HikariConfig: DEBUG
com.zaxxer.hikari: TRACE
file:
name: ./logs/kac-app/data.log
logback:
rollingpolicy:
clean-history-on-start: false
# file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.log
max-file-size: 10MB
max-history: 60
total-size-cap: 100MB
---
spring:
config:
activate:
on-profile: docker
logging:
level:
kr.co.palnet: info
jdbc: off
org.hibernate: off
# jdbc:
# audit: OFF
# resultset: OFF
# resultsettable: INFO #SQL 결과 데이터 Table을 로그로 남긴다.
# sqlonly: OFF #SQL만 로그로 남긴다.
# sqltiming: info #SQL과 소요시간을 표기한다.
# connection : trace # 커넥션 확인가능
# org.hibernate:
# SQL: off
# type.descriptor.sql.BasicBinder: TRACE
# com.zaxxer.hikari.HikariConfig: DEBUG
# com.zaxxer.hikari: TRACE

1967
app/kac-app/src/main/resources/static/docs/index.html

File diff suppressed because it is too large Load Diff

46
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java

@ -1,12 +1,12 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.common.model.common.ControlDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.DroneHistoryDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.socket.core.command.DroneCommand;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.storage.DroneCacheStorage;
import kr.co.palnet.kac.socket.core.storage.DroneStorage;
import kr.co.palnet.kac.socket.service.KacAppService;
import kr.co.palnet.kac.socket.service.WebSocketService;
import kr.co.palnet.kac.util.DroneUtil;
@ -38,7 +38,7 @@ public class AdsbDroneCommandImpl implements DroneCommand {
@Override
public void command(DroneRq rq) {
log.info(">>>> AdsbCommandServiceImpl <<<<<");
log.debug(">>>> AdsbCommandServiceImpl <<<<<");
List<DroneDto> resultList = rq.getBody();
/** 전문 설정 ***/
@ -78,10 +78,10 @@ public class AdsbDroneCommandImpl implements DroneCommand {
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto droneCacheDTO = controlStorage.get(drone.getObjectId());
DroneCacheStorage droneCacheStorage = DroneCacheStorage.getInstance();
DroneDto droneCacheDto = droneCacheStorage.get(drone.getObjectId());
if (droneCacheDTO == null) {
if (droneCacheDto == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
try {
SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId());
@ -91,33 +91,35 @@ public class AdsbDroneCommandImpl implements DroneCommand {
drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
drone.setControlStartDt(Instant.now());
ControlDto controlDto = new ControlDto();
controlDto.setControlId(simpleControlDto.getControlId());
controlDto.setTypeCd(simpleControlDto.getTypeCd());
controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
controlDto.setRegTime(System.currentTimeMillis());
// ControlDto controlDto = new ControlDto();
// controlDto.setControlId(simpleControlDto.getControlId());
// controlDto.setTypeCd(simpleControlDto.getTypeCd());
// controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
// controlDto.setRegTime(System.currentTimeMillis());
drone.setRegDt(Instant.now());
} catch (Exception e) {
log.error("ERROR : {}", e.getMessage(), e);
}
} else {
drone.setControlId(droneCacheDTO.getControlId());
drone.setControlId(droneCacheDto.getControlId());
drone.setTypeCd("02");
drone.setAreaTrnsYn(droneCacheDTO.getAreaTrnsYn());
drone.setControlWarnCd(droneCacheDTO.isControlWarnCd());
droneCacheDTO.setRegTime(System.currentTimeMillis());
drone.setAreaTrnsYn(droneCacheDto.getAreaTrnsYn());
drone.setControlWarnCd(droneCacheDto.isControlWarnCd());
drone.setControlStartDt(droneCacheDto.getControlStartDt());
// droneCacheDTO.setRegTime(System.currentTimeMillis());
drone.setRegDt(Instant.now());
controlStorage.put(drone.getObjectId(), droneCacheDTO);
droneCacheStorage.put(drone.getObjectId(), drone);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
/*
// 저장 해 놓았다가 한거번에 전송
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
*/
kacAppService.sendData(drone);
// 저장 해 놓았다가 한거번에 전송 - 필요한 곳에 전송(HISTORY, UTM)
DroneStorage dronStorage = DroneStorage.getInstance();
dronStorage.add(drone);
} catch (Exception e) {
log.error("ERROR : {}", e.getMessage(), e);
}

51
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java

@ -1,12 +1,12 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.common.model.common.ControlDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.DroneHistoryDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.socket.core.command.DroneCommand;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.storage.DroneCacheStorage;
import kr.co.palnet.kac.socket.core.storage.DroneStorage;
import kr.co.palnet.kac.socket.service.KacAppService;
import kr.co.palnet.kac.socket.service.WebSocketService;
import kr.co.palnet.kac.util.DroneUtil;
@ -37,7 +37,7 @@ public class AntosDroneCommandImpl implements DroneCommand {
@Override
public void command(DroneRq rq) {
log.info(">>>> AntosCommandServiceImpl <<<<<");
log.debug(">>>> AntosCommandServiceImpl <<<<<");
List<DroneDto> resultList = rq.getBody();
/** 전문 설정 ***/
@ -77,10 +77,11 @@ public class AntosDroneCommandImpl implements DroneCommand {
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(drone.getObjectId());
DroneCacheStorage droneCacheStorage = DroneCacheStorage.getInstance();
// ControlDto dronCacheDTO = controlStorage.get(drone.getObjectId());
DroneDto dronCacheDto = droneCacheStorage.get(drone.getObjectId());
if (dronCacheDTO == null) {
if (dronCacheDto == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
try {
SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId());
@ -90,35 +91,36 @@ public class AntosDroneCommandImpl implements DroneCommand {
drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
drone.setControlStartDt(Instant.now());
ControlDto controlDto = new ControlDto();
controlDto.setControlId(simpleControlDto.getControlId());
controlDto.setTypeCd(simpleControlDto.getTypeCd());
controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
controlDto.setRegTime(System.currentTimeMillis());
// ControlDto controlDto = new ControlDto();
// controlDto.setControlId(simpleControlDto.getControlId());
// controlDto.setTypeCd(simpleControlDto.getTypeCd());
// controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
// controlDto.setRegTime(System.currentTimeMillis());
controlStorage.put(drone.getObjectId(), controlDto);
// controlStorage.put(drone.getObjectId(), controlDto);
// controlStorage.put(drone.getObjectId(), controlDto);
drone.setRegDt(Instant.now());
} catch (Exception e) {
log.error("ERROR : {}", e.getMessage(), e);
}
} else {
drone.setControlId(dronCacheDTO.getControlId());
drone.setControlId(dronCacheDto.getControlId());
drone.setTypeCd("02");
drone.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn());
drone.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
drone.setAreaTrnsYn(dronCacheDto.getAreaTrnsYn());
drone.setControlWarnCd(dronCacheDto.isControlWarnCd());
drone.setControlStartDt(dronCacheDto.getControlStartDt());
controlStorage.put(drone.getObjectId(), dronCacheDTO);
drone.setRegDt(Instant.now());
droneCacheStorage.put(drone.getObjectId(), drone);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
/*
// 저장 해 놓았다가 한거번에 전송
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
*/
kacAppService.sendData(drone);
// 저장 해 놓았다가 한거번에 전송 - 필요한 곳에 전송(HISTORY, UTM)
DroneStorage dronStorage = DroneStorage.getInstance();
dronStorage.add(drone);
} catch (Exception e) {
log.error("ERROR : {}", e.getMessage(), e);
}
@ -127,7 +129,8 @@ public class AntosDroneCommandImpl implements DroneCommand {
// STEP 3. 화면에 표출할 정보 WebSocket 전달
try {
if ("PA".equals(drone.getObjectId().substring(0, 2))) {
webSocketService.sendData(drone);
// webSocketService.sendData(drone);
webSocketService.asyncSendData(drone);
}
} catch (Exception e) {
log.error("ERROR : {}", e.getMessage(), e);

54
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java

@ -1,12 +1,12 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.common.model.common.ControlDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.DroneHistoryDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.socket.core.command.DroneCommand;
import kr.co.palnet.kac.socket.core.model.DroneRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.storage.DroneCacheStorage;
import kr.co.palnet.kac.socket.core.storage.DroneStorage;
import kr.co.palnet.kac.socket.service.KacAppService;
import kr.co.palnet.kac.socket.service.WebSocketService;
import kr.co.palnet.kac.util.DroneUtil;
@ -37,7 +37,7 @@ public class SandboxDroneCommandImpl implements DroneCommand {
@Override
public void command(DroneRq rq) {
log.info(">>>> SandboxCommandServiceImpl <<<<<");
log.debug(">>>> SandboxCommandServiceImpl <<<<<");
log.debug("time 011 : {}::{}", Instant.now(), Instant.now().toEpochMilli());
List<DroneDto> resultList = rq.getBody();
/** 전문 설정 ***/
@ -77,10 +77,10 @@ public class SandboxDroneCommandImpl implements DroneCommand {
Long start = System.currentTimeMillis();
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(drone.getObjectId());
DroneCacheStorage droneCacheStorage = DroneCacheStorage.getInstance();
DroneDto droneCacheDto = droneCacheStorage.get(drone.getObjectId());
if (dronCacheDTO == null) {
if (droneCacheDto == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
try {
log.debug("time 012 : {}::{}", Instant.now(), Instant.now().toEpochMilli());
@ -93,38 +93,44 @@ public class SandboxDroneCommandImpl implements DroneCommand {
drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
drone.setControlStartDt(Instant.now());
ControlDto controlDto = new ControlDto();
controlDto.setControlId(simpleControlDto.getControlId());
controlDto.setTypeCd(simpleControlDto.getTypeCd());
controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
controlDto.setRegTime(System.currentTimeMillis());
// DroneDto newDroneCacheDto = new DroneDto();
// newDroneCacheDto.setControlId(simpleControlDto.getControlId());
// newDroneCacheDto.setTypeCd(simpleControlDto.getTypeCd());
// newDroneCacheDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn());
// newDroneCacheDto.setRegDt(Instant.now());
controlStorage.put(drone.getObjectId(), controlDto);
// controlStorage.put(drone.getObjectId(), newDroneCacheDto);
droneCacheStorage.put(drone.getObjectId(), drone);
} catch (Exception e) {
log.error("ERROR : {}", e.getMessage(), e);
}
} else {
drone.setControlId(dronCacheDTO.getControlId());
drone.setControlId(droneCacheDto.getControlId());
drone.setTypeCd("02");
drone.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn());
drone.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
drone.setAreaTrnsYn(droneCacheDto.getAreaTrnsYn());
drone.setControlWarnCd(droneCacheDto.isControlWarnCd());
drone.setControlStartDt(droneCacheDto.getControlStartDt());
// droneCacheDto.setRegTime(System.currentTimeMillis());
// controlStorage.put(drone.getObjectId(), droneCacheDto);
controlStorage.put(drone.getObjectId(), dronCacheDTO);
drone.setRegDt(Instant.now());
droneCacheStorage.put(drone.getObjectId(), drone);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
/*
// 저장 해 놓았다가 한거번에 전송
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
*/
// kacAppService.sendData(drone);
kacAppService.asyncSendData(drone);
// kacAppService.asyncSendData(drone);
// 저장 해 놓았다가 한거번에 전송 - 필요한 곳에 전송(HISTORY, UTM)
DroneStorage dronStorage = DroneStorage.getInstance();
dronStorage.add(drone);
} catch (Exception e) {
log.error("ERROR : {}", e.getMessage(), e);
}
@ -138,7 +144,7 @@ public class SandboxDroneCommandImpl implements DroneCommand {
}
Long end = System.currentTimeMillis();
log.info(">>> during time : {} - {}", drone.getObjectId(), end - start);
log.debug(">>> during time : {} - {}", drone.getObjectId(), end - start);
} else {
log.error("좌표 정보가 존재하지 않습니다.");

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/config/AppReadyEvent.java

@ -16,7 +16,7 @@ public class AppReadyEvent implements ApplicationListener<ApplicationReadyEvent>
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
log.info(">>>> onApplicationEvent <<<<<");
log.debug(">>>> onApplicationEvent <<<<<");
socketServer.start();
}
}

8
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/config/NettyConfig.java

@ -32,7 +32,7 @@ public class NettyConfig {
@Bean
public ServerBootstrap serverBootstrap(ChannelInitializer channelInitializer) {
log.info(">>>>> serverBootstrap <<<<<");
log.debug(">>>>> serverBootstrap <<<<<");
// ServerBootstrap: 서버 설정을 도와주는 class
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup(), workerGroup())
@ -59,14 +59,14 @@ public class NettyConfig {
// boss: incoming connection을 수락하고, 수락한 connection을 worker에게 등록(register)
@Bean(destroyMethod = "shutdownGracefully")
public NioEventLoopGroup bossGroup() {
log.info(">>>>> bossGroup <<<<<");
log.debug(">>>>> bossGroup <<<<<");
return new NioEventLoopGroup(bossCount);
}
// worker: boss가 수락한 연결의 트래픽 관리
@Bean(destroyMethod = "shutdownGracefully")
public NioEventLoopGroup workerGroup() {
log.info(">>>>> workerGroup <<<<<");
log.debug(">>>>> workerGroup <<<<<");
return new NioEventLoopGroup();
}
@ -74,7 +74,7 @@ public class NettyConfig {
// 도메인 이름으로 객체 생성 가능
@Bean
public InetSocketAddress inetSocketAddress() {
log.info(">>>>> inetSocketAddress <<<<<");
log.debug(">>>>> inetSocketAddress <<<<<");
return new InetSocketAddress(port);
}
}

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java

@ -100,7 +100,7 @@ public class DroneHandler extends SimpleChannelInboundHandler<DroneRq> {
// 에러 처리
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
log.info(">>>> exceptionCaught <<<<<");
log.debug(">>>> exceptionCaught <<<<<");
DroneRs rs = DroneRs.builder()
.code("-9999")
.message("error - etc")

4
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/UtmDto.java

@ -16,13 +16,13 @@ public class UtmDto {
@JsonProperty("GPSime")
private String GPSime; // 시간 yyyyMMddHHmmss
@JsonProperty("droneInfo")
private List<DronInfo> dronInfo;
private List<DroneInfo> droneInfo;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class DronInfo {
public static class DroneInfo {
@JsonProperty("Id")
private String id;
@JsonProperty("Latitude")

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java

@ -23,7 +23,7 @@ public class ChannelInitializer extends io.netty.channel.ChannelInitializer<Sock
// 클라이언트 소켓 채널이 생성될 때 호출
@Override
protected void initChannel(SocketChannel ch) {
log.info(">>>>> initChannel <<<<<");
log.debug(">>>>> initChannel <<<<<");
ChannelPipeline pipeline = ch.pipeline();
// 뒤이어 처리할 디코더 및 핸들러 추가

4
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/SocketServer.java

@ -19,7 +19,7 @@ public class SocketServer {
private Channel serverChannel;
public void start() {
log.info(">>>>> start <<<<<");
log.debug(">>>>> start <<<<<");
try {
// ChannelFuture: I/O operation의 결과나 상태를 제공하는 객체
// 지정한 host, port로 소켓을 바인딩하고 incoming connections을 받도록 준비함
@ -36,7 +36,7 @@ public class SocketServer {
// Bean을 제거하기 전에 해야할 작업이 있을 때 설정
@PreDestroy
public void stop() {
log.info(">>>>> stop <<<<<");
log.debug(">>>>> stop <<<<<");
if (serverChannel != null) {
serverChannel.close();
serverChannel.parent().closeFuture();

23
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/ControlStorage.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneCacheStorage.java

@ -1,40 +1,41 @@
package kr.co.palnet.kac.socket.core.storage;
import kr.co.palnet.kac.common.model.common.ControlDto;
import kr.co.palnet.kac.common.model.common.DroneDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.Instant;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class ControlStorage {
public class DroneCacheStorage {
private final Map<String, ControlDto> controlMap;
private final Map<String, DroneDto> controlMap;
private final int REMOVE_TIME = 1000 * 10;
private ControlStorage() {
private DroneCacheStorage() {
controlMap = new ConcurrentHashMap<>();
}
public static ControlStorage getInstance() {
public static DroneCacheStorage getInstance() {
return LazyHolder.INSTANCE;
}
public static class LazyHolder {
private static final ControlStorage INSTANCE = new ControlStorage();
private static final DroneCacheStorage INSTANCE = new DroneCacheStorage();
}
public ControlDto get(String objectId) {
public DroneDto get(String objectId) {
return controlMap.get(objectId);
}
public ControlDto put(String objectId, ControlDto control) {
public DroneDto put(String objectId, DroneDto control) {
return controlMap.put(objectId, control);
}
public ControlDto remove(String objectId) {
public DroneDto remove(String objectId) {
return controlMap.remove(objectId);
}
@ -42,8 +43,8 @@ public class ControlStorage {
@Scheduled(fixedDelay = 1000 * 10)
public void remove() {
for (String key : controlMap.keySet()) {
ControlDto droneCacheDTO = controlMap.get(key);
long diff = System.currentTimeMillis() - droneCacheDTO.getRegTime();
DroneDto droneCacheDTO = controlMap.get(key);
long diff = Instant.now().toEpochMilli() - droneCacheDTO.getRegDt().toEpochMilli();
if(diff > REMOVE_TIME){
remove(key);
}

46
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneStorage.java

@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -89,33 +90,32 @@ public class DroneStorage {
public List<DroneDto> getAllByUtm() {
// 보내지 않은 모든 데이터 추출
return droneMap.values().stream().reduce((list, result) -> {
result.addAll(list);
List<DroneDto> yetSendData = list.stream().filter(droneDto -> !droneDto.isSendUtm()).toList();
result.addAll(yetSendData);
return result;
}).orElse(new ArrayList<>()).stream().filter(dronDto -> !dronDto.isSendUtm()).toList();
}).orElse(new ArrayList<>());
}
public List<DroneDto> getAllByHistory() {
// 보내지 않은 모든 데이터 추출
return droneMap.values().stream().reduce((list, result) -> {
result.addAll(list);
return result;
}).orElse(new ArrayList<>()).stream().filter(dronDto -> !dronDto.isSendHistroy()).toList();
}
public static void main(String[] args) {
DroneStorage dronStorage = DroneStorage.getInstance();
DroneDto dronDto = new DroneDto();
dronDto.setObjectId("test");
dronDto.setSendHistroy(false);
dronDto.setSendUtm(false);
dronDto.setRegDt(Instant.now());
// public List<DroneDto> getAllByHistory() {
// // 보내지 않은 모든 데이터 추출
// return droneMap.values().stream().reduce((list, result) -> {
// List<DroneDto> yetSendData = list.stream().filter(droneDto -> !droneDto.isSendHistroy()).toList();
// result.addAll(yetSendData);
// return result;
// }).orElse(new ArrayList<>());
// }
dronStorage.add(dronDto);
List<DroneDto> allByUtm = dronStorage.getAllByUtm();
allByUtm.forEach(c -> c.setSendUtm(true));
log.info("...");
public Map<String, List<DroneDto>> getAllByHistory() {
// 보내지 않은 모든 데이터 추출
Map<String, List<DroneDto>> sendList = new HashMap<>();
for (String objectId : droneMap.keySet()) {
List<DroneDto> droneDtoList = droneMap.get(objectId);
List<DroneDto> list = droneDtoList.stream().filter(droneDto -> !droneDto.isSendHistroy()).toList();
if (list != null && !list.isEmpty()) {
sendList.put(objectId, list);
}
}
return sendList;
}
}

1
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ExternalService.java

@ -7,7 +7,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;

24
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java

@ -6,6 +6,8 @@ import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@ -13,6 +15,9 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
import java.util.List;
import java.util.Map;
@Slf4j
@RequiredArgsConstructor
@Service
@ -21,7 +26,8 @@ public class KacAppService {
private String kacAppHost;
private final String GET_CONTROL_ID = "/v1/inner/socket/control";
private final String SEND_ALL = "/v1/inner/socket/receiver/drone";
private final String SEND_HISTORY = "/v1/inner/socket/receiver/drone";
private final String SEND_HISTORY_ALL = "/v1/inner/socket/receiver/drone/all";
// control id 가져오기
public SimpleControlDto getControlId(String objectId) {
@ -39,7 +45,7 @@ public class KacAppService {
public void sendData(DroneDto dto) {
RestClient client = getRestClient();
client.post()
.uri(SEND_ALL)
.uri(SEND_HISTORY)
.contentType(MediaType.APPLICATION_JSON)
.body(dto)
.retrieve()
@ -52,6 +58,20 @@ public class KacAppService {
sendData(dto);
}
public boolean sendDataAll(Map<String, List<DroneDto>> history){
RestClient client = getRestClient();
ResponseEntity<Void> resp = client.post()
.uri(SEND_HISTORY_ALL)
.contentType(MediaType.APPLICATION_JSON)
.body(history)
.retrieve()
.toBodilessEntity();
if(resp.getStatusCode() == HttpStatus.OK){
return true;
}
return false;
}
private RestClient getRestClient() {
return RestClient.builder()
.baseUrl(kacAppHost)

61
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java

@ -11,7 +11,9 @@ import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@ -20,25 +22,40 @@ import java.util.stream.Collectors;
public class ScheduledService {
private final ExternalService externalService;
private final KacAppService kacAppService;
@Scheduled(fixedDelay = 1000 * 2)
@Scheduled(fixedDelay = 2 * 1000)
public void sendDataByHistory() {
DroneStorage droneStorage = DroneStorage.getInstance();
Map<String, List<DroneDto>> history = droneStorage.getAllByHistory();
if (!history.isEmpty()) {
if (kacAppService.sendDataAll(history)) {
history.values().forEach(droneDtoList -> droneDtoList.forEach(droneDto -> droneDto.setSendHistroy(true)));
}
}
}
// utm에 전송
@Scheduled(fixedDelay = 2 * 1000)
public void sendDataToUtm() {
log.info(">>>> sendDataToUtm <<<<<");
DroneStorage dronStorage = DroneStorage.getInstance();
List<DroneDto> list = dronStorage.getAllByUtm();
// log.debug(">>>> sendDataToUtm <<<<<");
DroneStorage droneStorage = DroneStorage.getInstance();
List<DroneDto> list = droneStorage.getAllByUtm();
// 가공
List<UtmDto.DronInfo> dronInfoList = list.stream().map(model -> {
UtmDto.DronInfo dronInfo = UtmDto.DronInfo.builder()
List<UtmDto.DroneInfo> droneInfoList = list.stream().map(model -> {
UtmDto.DroneInfo droneInfo = UtmDto.DroneInfo.builder()
.id(model.getObjectId())
.latitude(model.getLat().toString())
.longitude(model.getLon().toString())
.height(model.getElev().toString())
.build();
return dronInfo;
return droneInfo;
}).collect(Collectors.toList());
if (dronInfoList.isEmpty()) return;
if (droneInfoList.isEmpty()) return;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
.withZone(ZoneId.of("Asia/Seoul"));
@ -46,7 +63,7 @@ public class ScheduledService {
UtmDto utmDto = UtmDto.builder()
.GPSime(dateStr)
.dronInfo(dronInfoList)
.droneInfo(droneInfoList)
.build();
// if (externalService.sendDataToUtm(utmDto)) {
@ -58,10 +75,28 @@ public class ScheduledService {
}
// 사용을 다한 데이터 제거
@Scheduled(fixedDelay = 1000 * 30)
public void removeDron() {
log.info(">>>> removeDron <<<<<");
DroneStorage dronStorage = DroneStorage.getInstance();
dronStorage.removeByCondition();
public void removeDrone() {
log.debug(">>>> removeDrone <<<<<");
DroneStorage droneStorage = DroneStorage.getInstance();
Map<String, List<DroneDto>> all = droneStorage.getAll();
if (all != null) {
log.debug(">>>> remove drone before size : {}::{}", all.keySet().size(), all.values().stream().reduce((list, result) -> {
result.addAll(list);
return result;
}).orElse(new ArrayList<>()).size());
}
droneStorage.removeByCondition();
if (all != null) {
log.debug(">>>> remove drone before size : {}::{}", all.keySet().size(), all.values().stream().reduce((list, result) -> {
result.addAll(list);
return result;
}).orElse(new ArrayList<>()).size());
}
}
}

3
app/kac-socket-app/src/main/resources/application.yml

@ -63,6 +63,9 @@ app:
server:
port: 8004
logging:
level:
kr.co.palnet: info

2
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java

@ -23,7 +23,7 @@ public class SocketReceiverController {
@PostMapping("/drone")
public ResponseEntity<Void> receiver(@RequestBody DroneDto droneDto) {
log.info("websocket message receiver : {}", droneDto);
log.debug("websocket message receiver : {}", droneDto);
DroneControlDto history = controlService.dronDtoToControlDtoConvert(droneDto);

2
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Decoder.java

@ -16,7 +16,7 @@ public class Decoder extends MessageToMessageDecoder<Object> {
@Override
protected void decode(ChannelHandlerContext ctx, Object in, List<Object> out) throws Exception {
log.info(">>>>> decode <<<<<");
log.debug(">>>>> decode <<<<<");
try {
} catch (Exception e) {
log.warn("decode parsing error : {} :: {}", e.getMessage(), in);

2
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java

@ -17,7 +17,7 @@ public class Encoder extends MessageToMessageEncoder<Object> {
@Override
protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
log.info(">>>>> encode <<<");
log.debug(">>>>> encode <<<");
try {
} catch (Exception e) {
log.warn("json parsing error : {} :: {}", e.getMessage(), msg);

2
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/config/AppReadyEvent.java

@ -16,7 +16,7 @@ public class AppReadyEvent implements ApplicationListener<ApplicationReadyEvent>
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
log.info(">>>> onApplicationEvent <<<<<");
log.debug(">>>> onApplicationEvent <<<<<");
socketServer.start();
}
}

8
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/config/NettyConfig.java

@ -33,7 +33,7 @@ public class NettyConfig {
@Bean
public ServerBootstrap serverBootstrap(ChannelInitializer channelInitializer) {
log.info(">>>>> serverBootstrap <<<<<");
log.debug(">>>>> serverBootstrap <<<<<");
// ServerBootstrap: 서버 설정을 도와주는 class
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup(), workerGroup());
@ -59,14 +59,14 @@ public class NettyConfig {
// boss: incoming connection을 수락하고, 수락한 connection을 worker에게 등록(register)
@Bean(destroyMethod = "shutdownGracefully")
public NioEventLoopGroup bossGroup() {
log.info(">>>>> bossGroup <<<<<");
log.debug(">>>>> bossGroup <<<<<");
return new NioEventLoopGroup(bossCount);
}
// worker: boss가 수락한 연결의 트래픽 관리
@Bean(destroyMethod = "shutdownGracefully")
public NioEventLoopGroup workerGroup() {
log.info(">>>>> workerGroup <<<<<");
log.debug(">>>>> workerGroup <<<<<");
return new NioEventLoopGroup();
}
@ -74,7 +74,7 @@ public class NettyConfig {
// 도메인 이름으로 객체 생성 가능
@Bean
public InetSocketAddress inetSocketAddress() {
log.info(">>>>> inetSocketAddress <<<<<");
log.debug(">>>>> inetSocketAddress <<<<<");
return new InetSocketAddress(port);
}
}

12
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/handler/WebSocketHandler.java

@ -20,25 +20,25 @@ public class WebSocketHandler extends SimpleChannelInboundHandler<WebSocketFrame
@Override
protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame msg) throws Exception {
log.info(">>>> channelRead0 <<<<<");
log.debug(">>>> channelRead0 <<<<<");
}
@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
log.info(">>>>> channelRegistered <<<<<");
log.debug(">>>>> channelRegistered <<<<<");
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.info(">>>>> channelActive <<<<<");
log.debug(">>>>> channelActive <<<<<");
ChannelStorage channelStorage = ChannelStorage.getInstance();
log.info("active size before : {}", channelStorage.getGroup().size());
log.debug("active size before : {}", channelStorage.getGroup().size());
channelStorage.add(ctx.channel());
log.info("active size after : {}", channelStorage.getGroup().size());
log.debug("active size after : {}", channelStorage.getGroup().size());
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
log.info(">>>>> channelInactive <<<<<");
log.debug(">>>>> channelInactive <<<<<");
}
}

4
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/socket/ChannelInitializer.java

@ -22,7 +22,7 @@ public class ChannelInitializer extends io.netty.channel.ChannelInitializer<Sock
// 클라이언트 소켓 채널이 생성될 때 호출
@Override
protected void initChannel(SocketChannel ch) {
log.info(">>>>> initChannel <<<<<");
log.debug(">>>>> initChannel <<<<<");
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
@ -34,6 +34,6 @@ public class ChannelInitializer extends io.netty.channel.ChannelInitializer<Sock
pipeline.addLast(webSocketHandler);
// pipeline.addLast(new WebSocketHandler());
log.info("pipeline : {}", pipeline);
log.debug("pipeline : {}", pipeline);
}
}

4
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/socket/WebSocketServer.java

@ -19,7 +19,7 @@ public class WebSocketServer {
private Channel serverChannel;
public void start() {
log.info(">>>>> start <<<<<");
log.debug(">>>>> start <<<<<");
try {
// ChannelFuture: I/O operation의 결과나 상태를 제공하는 객체
// 지정한 host, port로 소켓을 바인딩하고 incoming connections을 받도록 준비함
@ -36,7 +36,7 @@ public class WebSocketServer {
// Bean을 제거하기 전에 해야할 작업이 있을 때 설정
@PreDestroy
public void stop() {
log.info(">>>>> stop <<<<<");
log.debug(">>>>> stop <<<<<");
if (serverChannel != null) {
serverChannel.close();
serverChannel.parent().closeFuture();

2
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java

@ -21,7 +21,7 @@ public class ControlService {
ControlStorage controlCache = ControlStorage.getInstance();
Map<String, DroneControlDto> allHistory = controlCache.getAll();
log.info(">>> getList :: {}", allHistory);
log.debug(">>> getList :: {}", allHistory);
if (Objects.nonNull(allHistory)) {
allHistory.forEach((k, v) -> {

4
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java

@ -26,7 +26,7 @@ public class ScheduledService {
// 접속한 모든 채널에 데이터 전송
@Scheduled(fixedDelay = 10 * 1000) // 10초
public void sendAllChannel() {
log.info("ready send to all channel");
log.debug("ready send to all channel");
// 채널 가져오기
ChannelStorage channelStorage = ChannelStorage.getInstance();
ChannelGroup channelGroup = channelStorage.getGroup();
@ -46,7 +46,7 @@ public class ScheduledService {
} catch (Exception e) {
log.warn("send fail to all channel. : {}", e.getMessage(), e);
}
log.info("done send to all channel");
log.debug("done send to all channel");
}
}

5
app/kac-websocket-app/src/main/resources/application.yml

@ -44,5 +44,10 @@ app:
server:
port: 8002
logging:
level:
kr.co.palnet: info

6
common/config-db/src/main/resources/application-db.yml

@ -10,6 +10,12 @@ spring:
jdbc-url: jdbc:log4jdbc:mysql://localhost:13306/PAV_KAC?characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
username: kac
password: palnet!234
minimumidle: 5
maximumpoolsize: 5
idletimeout: 60000
maxlifetime: 300000
connectiontimeout: 30000
validationtimeout: 5000
---

18
common/model/src/main/java/kr/co/palnet/kac/common/model/common/ControlDto.java

@ -1,18 +0,0 @@
package kr.co.palnet.kac.common.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ControlDto {
private String controlId;
private String typeCd;
private String areaTrnsYn;
private boolean controlWarnCd;
private Long regTime;
}

8
common/util/src/main/java/kr/co/palnet/kac/util/EncryptUtil.java

@ -33,7 +33,7 @@ public class EncryptUtil {
// 암호화
public static String encrypt(String key, String initVector, String value) {
// log.info("encrypt() key: {}, initVector: {}, value: {}", key, initVector, value);
// log.debug("encrypt() key: {}, initVector: {}, value: {}", key, initVector, value);
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
@ -54,7 +54,7 @@ public class EncryptUtil {
// 복호화
public static String decrypt(String key, String initVector, String encrypted) {
// log.info("decrypt() key: {}, initVector: {}, encrypted: {}", key, initVector, encrypted);
// log.debug("decrypt() key: {}, initVector: {}, encrypted: {}", key, initVector, encrypted);
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8));
@ -80,8 +80,8 @@ public class EncryptUtil {
// WkaOhqSK03Z1pSuPOdc03w==
// WkaOhqSK03Z1pSuPOdc03w==
String encrypted = encrypt(test);
log.info("encrypted: {}", encrypted);
log.debug("encrypted: {}", encrypted);
String decrypted = decrypt(encrypted);
log.info("decrypted: {}", decrypted);
log.debug("decrypted: {}", decrypted);
}
}

22
data/com/src/test/java/kr/co/palnet/kac/data/com/service/ComCodeDomainServiceTest.java

@ -32,7 +32,7 @@ class ComCodeDomainServiceTest {
@BeforeEach
void before() {
log.info("before start");
log.debug("before start");
this.comCdLangCtgRepository.deleteAll();
this.comCdBasRepository.deleteAll();
this.comCdGroupBasRepository.deleteAll();
@ -89,52 +89,52 @@ class ComCodeDomainServiceTest {
}
log.info("before end");
log.debug("before end");
}
@DisplayName("before...")
@Test
void testBefore() {
log.info("before...");
log.debug("before...");
}
@DisplayName("그룹 조회 - 목록")
@Test
void getComCdGroupBasList() {
comCodeDomainService.getComCdGroupBasList(null).forEach(comCdGroupBas -> log.info("{}", comCdGroupBas));
comCodeDomainService.getComCdGroupBasList(null).forEach(comCdGroupBas -> log.debug("{}", comCdGroupBas));
}
@DisplayName("그룹 조회 - 단건")
@Test
void getComCdGroupBas() {
var comCdGroupBas = comCodeDomainService.getComCdGroupBas("TEST");
log.info("{}", comCdGroupBas);
log.debug("{}", comCdGroupBas);
}
@DisplayName("코드 조회 - 목록")
@Test
void getComCdBasList() {
comCodeDomainService.getComCdBasList("TEST").forEach(bas -> log.info("{}", bas));
comCodeDomainService.getComCdBasList("TEST").forEach(bas -> log.debug("{}", bas));
}
@DisplayName("코드 조회 - 단건")
@Test
void getComCdBas() {
var comCdBas = comCodeDomainService.getComCdBas("TEST", "TEST");
log.info("{}", comCdBas);
log.debug("{}", comCdBas);
}
@DisplayName("언어 조회 - 목록")
@Test
void getComCdLangCtgList() {
comCodeDomainService.getComCdLangCtgList("TEST", "TEST").forEach(lang -> log.info("{}", lang));
comCodeDomainService.getComCdLangCtgList("TEST", "TEST").forEach(lang -> log.debug("{}", lang));
}
@DisplayName("언어 조회 - 단건")
@Test
void getComCdLangCtg() {
ComCdLangCtg comCdLangCtg = comCodeDomainService.getComCdLangCtg("TEST", "TEST", "ko_KR");
log.info("{}", comCdLangCtg);
log.debug("{}", comCdLangCtg);
}
@ -175,7 +175,7 @@ class ComCodeDomainServiceTest {
.cdNm("테스트1")
.build();
ComCdLangCtg comCdLangCtg = comCodeDomainService.createComCdLangCtg(entity);
log.info("{}", comCdLangCtg);
log.debug("{}", comCdLangCtg);
}
@DisplayName("그룹 수정 - 단건")
@ -188,7 +188,7 @@ class ComCodeDomainServiceTest {
.rm("비고-update")
.build();
ComCdGroupBas comCdGroupBas = comCodeDomainService.updateComCdGroupBas(entity);
log.info("{}", comCdGroupBas);
log.debug("{}", comCdGroupBas);
}
@DisplayName("코드 수정 - 단건")

4
data/pty/src/test/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainServiceTest.java

@ -45,8 +45,8 @@ class PtyCstmrDomainServiceTest {
.build();
PtyCstmrBas ptyCstmrBas = ptyCstmrBasRepository.saveAndFlush(bas);
log.info("ptyCstmrBas >> {}", ptyCstmrBas);
log.info("bas >> {}", bas);
log.debug("ptyCstmrBas >> {}", ptyCstmrBas);
log.debug("bas >> {}", bas);
}

8
socket-test/pav-100-dron.js

@ -2,9 +2,10 @@ const { getConnection, writeData } = require('./pav-client');
const { dumyData } = require('./pav-utils');
const host = "localhost"
const port = 8003;
// const port = 8003;
const port = 18003;
const prefix = 'PA-DRON-';
const prefix = 'PA-DRON-004-';
const severalDrones = cnt => {
// 클라이언트 정보 저장공간
const clients = [];
@ -55,7 +56,7 @@ const severalDrones = cnt => {
return clients;
};
//
const clients = severalDrones(100);
const clients = severalDrones(10);
const dist = 0.01;
const sendData = cnt => {
const direction = Math.floor(cnt / 10) % 4;
@ -91,6 +92,7 @@ const sendData = cnt => {
const iteratorSendData = (cnt = 0) => {
setTimeout(() => sendData(cnt), 1000);
// sendData(cnt)
};
iteratorSendData();

2
socket-test/pav-client.js

@ -10,6 +10,7 @@ const getConnection = (connName, host, port) => {
this.setEncoding('utf8');
this.on('data', function (data) {
console.log(connName + " From Server: " + data.toString());
console.log('response time : ', new Date());
// this.end();
});
this.on('end', function () {
@ -29,6 +30,7 @@ const getConnection = (connName, host, port) => {
}
const writeData = (socket, data) => {
console.log('start time : ', new Date());
const success = !!socket.write(data);
// if (success) {
// (function (socket, data) {

Loading…
Cancel
Save