From c268cc2cbba93a9115995399ce9d70f0ad82d5d0 Mon Sep 17 00:00:00 2001 From: "semin.baek" Date: Thu, 15 May 2025 18:03:58 +0900 Subject: [PATCH] =?UTF-8?q?command=20line=20=EC=83=81=ED=83=9C=20=EC=A0=90?= =?UTF-8?q?=EA=B2=80=20=EA=B8=B0=EB=8A=A5=20=EC=99=84=EB=A3=8C=20=20-=20bs?= =?UTF-8?q?m-lab/dfxagent#1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/dfxagent.sample.yml | 12 -- .../com/bsmlab/dfx/agent/DfxAgentRunner.java | 147 ++++++++++++++++++ .../agent/config/DfxAgentConfiguration.java | 8 +- .../status/StatusCheckerSchedulerService.java | 1 - src/main/resources/application.yml | 3 + src/main/resources/banner.txt | 3 +- 6 files changed, 155 insertions(+), 19 deletions(-) delete mode 100644 src/docs/dfxagent.sample.yml create mode 100644 src/main/java/com/bsmlab/dfx/agent/DfxAgentRunner.java diff --git a/src/docs/dfxagent.sample.yml b/src/docs/dfxagent.sample.yml deleted file mode 100644 index ba716e1..0000000 --- a/src/docs/dfxagent.sample.yml +++ /dev/null @@ -1,12 +0,0 @@ -datasource: - dfcms: - driverClassName: org.postgresql.Driver - url: jdbc:postgresql://bsm-lab.com:5432/defree?currentSchema=DFCMS - username: defreeadmin - password: qortpals1! - mochastory: - driverClassName: com.mysql.jdbc.Driver - url: jdbc:mysql://bsm-lab.com:3306/MOCHASTORY?allowPublicKeyRetrieval=true - username: MOCHASTORY - password: MOCHASTORY - diff --git a/src/main/java/com/bsmlab/dfx/agent/DfxAgentRunner.java b/src/main/java/com/bsmlab/dfx/agent/DfxAgentRunner.java new file mode 100644 index 0000000..b75ae9f --- /dev/null +++ b/src/main/java/com/bsmlab/dfx/agent/DfxAgentRunner.java @@ -0,0 +1,147 @@ +package com.bsmlab.dfx.agent; + +import com.bsmlab.dfx.agent.config.AgentConfigDto; +import com.bsmlab.dfx.agent.config.AgentConfigReader; +import com.bsmlab.dfx.agent.config.datasource.DynamicRoutingDataSource; +import com.bsmlab.dfx.agent.listener.dto.AckDto; +import com.bsmlab.dfx.agent.listener.dto.CommandDto; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Slf4j +@RequiredArgsConstructor +@Component +public class DfxAgentRunner implements ApplicationRunner { + private final AgentConfigReader agentConfigReader; + private final DynamicRoutingDataSource dynamicRoutingDataSource; + + @Override + public void run(ApplicationArguments args) throws Exception { + // command line 실행 중 --check-config 가 있는 경우 settings.json 을 로드하여 DB 연결, knownAgent 연결 테스트를 진행한다. + // java -jar $AGENT_HOME/lib/dfxagent.jar --setting.check --setting.file=$AGENT_HOME/conf/settings.json & + if(args.containsOption("setting.check")) { + this.print("-----------------------"); + this.print("DfxAgent 설정 및 환경 점검"); + this.print("-----------------------"); + this.print(" (설정 파일: " + args.getOptionValues("setting.file") + ")"); + // settings.json 점검 로직 + boolean isValid = true; + + this.print(""); + this.print("데이터베이스 설정 점검"); + Map dataSourceMap = dynamicRoutingDataSource.getDataSourceMap(); + if(dataSourceMap != null && !dataSourceMap.isEmpty()) { + for(Object key : dataSourceMap.keySet()) { + DataSource dataSource = (DataSource) dataSourceMap.get(key); + AgentConfigDto.DataSourceConfig dataSourceConfig = null; + List dataSourceConfigList = agentConfigReader.getAgentConfigDto().getDataSourceConfig(); + for(AgentConfigDto.DataSourceConfig thisDataSourceConfig : dataSourceConfigList) { + if(thisDataSourceConfig.getDataSourceId().equals(key)) { + dataSourceConfig = thisDataSourceConfig; + break; + } + } + this.print("DB 점검 [" + dataSourceConfig.toString() + "]"); + try(Connection connection = dataSource.getConnection()) { + connection.isValid(10); + this.print("DB 연결에 성공하였습니다."); + } + catch(SQLException e) { + this.print("DB 연결에 실패하였습니다. (" + e.getLocalizedMessage() + ")"); + isValid = false; + } + catch(Exception e) { + this.print("DB 점검에 실패하였습니다. (" + e.getLocalizedMessage() + ")"); + isValid = false; + } + } + } + else { + this.print("데이터베이스 설정은 포함되어 있지 않습니다."); + isValid = false; + } + + this.print(""); + this.print("상대 agent 설정 점검"); + List knownAgentList = agentConfigReader.getAgentConfigDto().getKnownAgentList(); + if(knownAgentList != null && !knownAgentList.isEmpty()) { + for(AgentConfigDto.KnownAgent knownAgent : knownAgentList) { + try { + String messageUuid = UUID.randomUUID().toString(); + CommandDto commandDto = CommandDto.builder().commandType(CommandDto.CommandType.ALIVE).messageUuid(messageUuid).build(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + HttpEntity bodyEntity = new HttpEntity<>(commandDto, httpHeaders); + RestTemplate restTemplate = new RestTemplate(); + String url = "http://" + knownAgent.getHostName() + ":" + knownAgent.getListenPort() + "/command"; + this.print("상대 agent " + knownAgent.getHostId() + "(" + knownAgent.getHostName() + ":" + knownAgent.getListenPort() + ") 연결 점검"); + String response = restTemplate.postForObject(url, bodyEntity, String.class); + ObjectMapper objectMapper = new ObjectMapper(); + AckDto ackDto = null; + ackDto = objectMapper.readValue(response, new TypeReference() {}); + if(AckDto.ResultType.PROCESS_SUCCESS == ackDto.getResult()) { + this.print("상대 agent " + knownAgent.getHostId() + "(" + knownAgent.getHostName() + "가 정상 동작합니다."); + } + else { + this.print("상대 agent " + knownAgent.getHostId() + "(" + knownAgent.getHostName() + "가 응답하였으나 정상 동작하지 않습니다."); + isValid = false; + } + } + catch (JsonProcessingException e) { + this.print("상대 agent " + knownAgent.getHostId() + "(" + knownAgent.getHostName() + "가 응답메시지가 정상적이지 않습니다. (" + e.getLocalizedMessage() + ")"); + isValid = false; + } + catch (ResourceAccessException e) { + this.print("상대 agent " + knownAgent.getHostId() + "(" + knownAgent.getHostName() + "가 응답하지 않습니다. (" + e.getLocalizedMessage() + ")"); + isValid = false; + } + catch (Exception e) { + this.print("상대 agent " + knownAgent.getHostId() + "(" + knownAgent.getHostName() + "상태를 알 수 없습니다. (" + e.getLocalizedMessage() + ")"); + isValid = false; + } + } + } + else { + this.print("상대 agent 설정은 포함되어 있지 않습니다."); + isValid = false; + } + + this.print(""); + this.print("--------------------------------------"); + if(isValid) { + this.print("설정과 환경이 정상적입니다."); + this.print("점검을 종료합니다."); + System.exit(0); + } + else { + this.print("설정 또는 환경에 오류가 포함되어 있습니다."); + this.print("점검을 종료합니다."); + System.exit(2); + } + this.print("--------------------------------------"); + } + } + + private void print(String text) { + System.out.println(text); + } +} + diff --git a/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java b/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java index 182f38f..e3923b6 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java @@ -19,7 +19,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import java.io.File; @@ -75,12 +74,10 @@ public class DfxAgentConfiguration { else if ("jar".equalsIgnoreCase(uri.getScheme()) || location.toString().startsWith("jar:")) { // JAR 내부 경로일 경우 String path = location.toString(); - log.debug("path: {}", path); if (path.startsWith("jar:")) { path = path.substring(4, path.indexOf("!") - 1); path = path.substring(path.indexOf(":") + 1, path.lastIndexOf("/")); } - log.debug("path: {}", path); file = new File(path); } else { @@ -150,9 +147,12 @@ public class DfxAgentConfiguration { else if(org.postgresql.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) { dataSource.setValidationQuery("SELECT 1"); } - else if(com.mysql.jdbc.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) { + else if(com.mysql.cj.jdbc.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) { dataSource.setValidationQuery("SELECT 1"); } +// else if(com.mysql.jdbc.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) { +// dataSource.setValidationQuery("SELECT 1"); +// } else if(org.mariadb.jdbc.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) { dataSource.setValidationQuery("SELECT 1"); } diff --git a/src/main/java/com/bsmlab/dfx/agent/task/status/StatusCheckerSchedulerService.java b/src/main/java/com/bsmlab/dfx/agent/task/status/StatusCheckerSchedulerService.java index 6457f4a..bfbed6c 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/status/StatusCheckerSchedulerService.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/status/StatusCheckerSchedulerService.java @@ -69,7 +69,6 @@ public class StatusCheckerSchedulerService { this.agentConfigReader.setKnownAgentStatus(knownAgent.getHostId(), "DOWN"); log.debug("known agent {} {} alive message is not valid then set DOWN", knownAgent.getHostId(), knownAgent.getHostName()); } - } } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index acb0e80..8aa2a4a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,5 +7,8 @@ spring: max-request-size: 1GB logging: level: + root: ERROR + org.springframework.boot: ERROR com.bsmlab.dfx.agent: DEBUG + com.bsmlab.dfx.agent.DfxAgentApplication: WARN diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt index 9fcd18d..94643fc 100644 --- a/src/main/resources/banner.txt +++ b/src/main/resources/banner.txt @@ -5,5 +5,4 @@ | '--' || | / . \ / _____ \ | |__| | | |____ | |\ | | | |_______/ |__| /__/ \__\ /__/ \__\ \______| |_______||__| \__| |__| -${application.title} ${application.version} -Powered by Spring Boot ${spring-boot.version} \ No newline at end of file +${application.title} ${application.version} \ No newline at end of file