commit 8eaef928018b7b51be35c2d1ee961b13c640e1b0 Author: MonHun Date: Sat Apr 27 17:15:54 2024 +0900 win 0427 diff --git a/lib/ipworks-local-1.0.0.jar b/lib/ipworks-local-1.0.0.jar new file mode 100644 index 0000000..557d507 Binary files /dev/null and b/lib/ipworks-local-1.0.0.jar differ diff --git a/lib/state-spring-boot-starter-1.0.3.jar b/lib/state-spring-boot-starter-1.0.3.jar new file mode 100644 index 0000000..4f5a7df Binary files /dev/null and b/lib/state-spring-boot-starter-1.0.3.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cb60256 --- /dev/null +++ b/pom.xml @@ -0,0 +1,95 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.8 + + + kr.gmtc.gw + elastic + 0.0.1-SNAPSHOT + EyeElastic + Demo project for Spring Boot + + + + local-repository + local-repository + file:${project.basedir}/lib + + + + + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + + org.projectlombok + lombok + provided + + + + com.sun.jersey + jersey-client + 1.19 + compile + + + + org.json + json + 20231013 + + + + com.google.code.gson + gson + 2.8.9 + + + + + + + + + + EyeELK + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + diff --git a/src/main/java/kr/gmtc/gw/comp/thread/CustomThread.java b/src/main/java/kr/gmtc/gw/comp/thread/CustomThread.java new file mode 100644 index 0000000..db977f4 --- /dev/null +++ b/src/main/java/kr/gmtc/gw/comp/thread/CustomThread.java @@ -0,0 +1,113 @@ +package kr.gmtc.gw.comp.thread; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import kr.gmtc.gw.comp.thread.handler.CustomThreadOnTerminate; +import kr.gmtc.gw.comp.thread.handler.CustomThreadWork; + +public class CustomThread extends Thread{ + + /* 대기시간 없음 */ + public static final long NO_SLEEP = 0; + /* 1밀리 초 */ + public static final long SLEEP_MILLI_SEC = 1; + /* 1초 */ + public static final long SLEEP_SECOND = 1000; + /* 30초 */ + public static final long SLEEP_HALF_MINIUTE = 30000; + /* 1분 */ + public static final long SLEEP_MINIUTE = 60000; + + public final String controllClassName; + public final long repeatMiliSec; + public final CustomThreadWork definedWork; + public final CustomThreadOnTerminate definedTerminate; + public final Logger logger; + private boolean running; + + /** + * 인터럽트를 받을 시 스레드가 종료됨.
+ * {@link Thread#sleep(long)} 기반으로 재실행 간격을 설정하므로 정확한 실행시간을 보장하지 않음.
+ * 정확한 실행시간 보장이 필요 할 경우 sleep 간격을 짧게 설정하고 호출위치에서 시간확인
+ * 정상적인 종료는 {@link #gracefulStop()}으로 종료함 + * @param threadName 스레드 이름 + * @param controllClass 스레드 관리 클래스, 일반적으로 this 사용 + * @param repeatMiliSec Sleep 시간(밀리 초), 0이하의 경우 대기시간 없음 + * @param definedWork 반복할 작업 + * @param definedTerminate 스레드가 인터럽트에 의해 종료될 경우 할 작업 + * @param autoStart 생성즉시 실행 + */ + + public CustomThread(String threadName, Object controllClass, long repeatMiliSec, + CustomThreadWork definedWork, CustomThreadOnTerminate definedTerminate, boolean autoStart) { + + if (definedWork == null) { + throw new IllegalArgumentException("[CustomThread] - definedWork is null."); + } + + this.definedWork = definedWork; + this.definedTerminate = definedTerminate; + this.controllClassName = controllClass == null ? "" : controllClass.getClass().getSimpleName(); + this.repeatMiliSec = repeatMiliSec > 0 ? repeatMiliSec : 0; + this.logger = LoggerFactory.getLogger(CustomThread.class); + this.running = false; + + setName(threadName); + setDaemon(true); + if (autoStart) { + this.start(); + } + } + + + @Override + public void run() { + logger.info("[CustomThread] Started."); + while ( this.running && !this.isInterrupted()) { + try { + try { + this.definedWork.work(); + } finally { + if (this.repeatMiliSec > 0) { + Thread.sleep(this.repeatMiliSec); + } + } + } catch(InterruptedException e) { // 인터럽트 수신시 종료 + logger.error("[CustomThread] Interrupted. "+ e.toString()); + Thread.currentThread().interrupt(); + break; + } catch(Exception e) { // 처리되지 않은 예외 로깅, 예외에 의한 무한루프에 주의 + logger.error("[CustomThread] Unknown Exception Occur. " + e.toString()); + } + } + + if(this.definedTerminate != null) { + this.definedTerminate.onTerminate(); + } + + logger.error("[CustomThread] Stoped."); + + } + + @Override + public String toString() { + + return "CustomThread [controllClass=" + this.controllClassName + ", threadName=" + getName() + + ", runnig=" + this.running + ", alive=" + isAlive()+ ", repeatMiliSec=" + this.repeatMiliSec + + ", definedTerminate=" + (this.definedTerminate == null ? "no" : "yes") + "]"; + } + + @Override + public synchronized void start() { + this.running = true; + super.start(); + } + + /** + * 스레드 정상종료, 진행중인 작업 완료 후 종료됨. + */ + public void gracefulStop() { + this.running = false; + } +} diff --git a/src/main/java/kr/gmtc/gw/comp/thread/handler/CustomThreadOnTerminate.java b/src/main/java/kr/gmtc/gw/comp/thread/handler/CustomThreadOnTerminate.java new file mode 100644 index 0000000..8f6930b --- /dev/null +++ b/src/main/java/kr/gmtc/gw/comp/thread/handler/CustomThreadOnTerminate.java @@ -0,0 +1,6 @@ +package kr.gmtc.gw.comp.thread.handler; + +@FunctionalInterface +public interface CustomThreadOnTerminate { + public void onTerminate(); +} diff --git a/src/main/java/kr/gmtc/gw/comp/thread/handler/CustomThreadWork.java b/src/main/java/kr/gmtc/gw/comp/thread/handler/CustomThreadWork.java new file mode 100644 index 0000000..4d3d156 --- /dev/null +++ b/src/main/java/kr/gmtc/gw/comp/thread/handler/CustomThreadWork.java @@ -0,0 +1,6 @@ +package kr.gmtc.gw.comp.thread.handler; + +@FunctionalInterface +public interface CustomThreadWork { + public void work() throws Exception; +} diff --git a/src/main/java/kr/gmtc/gw/elastic/ESApplication.java b/src/main/java/kr/gmtc/gw/elastic/ESApplication.java new file mode 100644 index 0000000..03ff435 --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/ESApplication.java @@ -0,0 +1,29 @@ +package kr.gmtc.gw.elastic; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.ApplicationPidFileWriter; +import org.springframework.boot.system.ApplicationHome; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableScheduling +@SpringBootApplication +public class ESApplication { + + public static void main(String[] args) { + + ApplicationHome home = new ApplicationHome(ESApplication.class); + String root = home.getDir().getPath(); + + System.setProperty("user.dir", root); + + Thread.currentThread().setName("JVM - Main"); + + SpringApplication springApplication = new SpringApplication(ESApplication.class); + + springApplication.addListeners(new ApplicationPidFileWriter("./application.pid")); + springApplication.run(args); + + } + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/config/ElasticsearchClientConfig.java b/src/main/java/kr/gmtc/gw/elastic/config/ElasticsearchClientConfig.java new file mode 100644 index 0000000..4e5010a --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/config/ElasticsearchClientConfig.java @@ -0,0 +1,36 @@ +package kr.gmtc.gw.elastic.config; + +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.elasticsearch.client.ClientConfiguration; +import org.springframework.data.elasticsearch.client.RestClients; +import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; + +@Configuration +//@EnableElasticsearchRepositories(basePackages = "kr.gmtc.gw.elk.repositories") +@ComponentScan(basePackages = {"kr.gmtc.gw.elk"}) +public class ElasticsearchClientConfig extends AbstractElasticsearchConfiguration { + + @Value("${app.config.elastic.host}") + private String gsEsHost; + + @Value("${app.config.elastic.port}") + private String gsEsPort; + + @Override + @Bean(destroyMethod = "close") + public RestHighLevelClient elasticsearchClient() { + final ClientConfiguration clientConfiguration = + ClientConfiguration + .builder() + .connectedTo(gsEsHost + ":" + gsEsPort) + //.connectedTo( "10.200.31.129:9200") + .build(); + + return RestClients.create(clientConfiguration).rest(); + } + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/parser/ReplayLogParser_AILocation.java b/src/main/java/kr/gmtc/gw/elastic/parser/ReplayLogParser_AILocation.java new file mode 100644 index 0000000..b1364dd --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/parser/ReplayLogParser_AILocation.java @@ -0,0 +1,132 @@ +package kr.gmtc.gw.elastic.parser; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; + +import kr.gmtc.gw.elastic.utils.LogMsgParserUtile; +import kr.gmtc.gw.elastic.vo.ElasticMsgHeader; +import kr.gmtc.gw.elastic.vo.ElasticResultMsgVO; +import kr.gmtc.gw.elastic.vo.LogMsgParserVO; +import kr.gmtc.gw.elastic.vo.ReplayLog.AiLocationVO; +import kr.gmtc.gw.elastic.vo.ReplayLog.StandRouteVO; +import kr.gmtc.gw.elastic.vo.ReplayLog.StandRouteVO.RoutePoints; + +public class ReplayLogParser_AILocation { + + private List logMsgs; + + Queue parserAiLocQ = new LinkedBlockingQueue(); + + LogMsgParserUtile pUtile; + + public ReplayLogParser_AILocation(){ + + pUtile = new LogMsgParserUtile(); + + } + + public void logParser(List recvMsgs){ + + this.logMsgs = recvMsgs; + + List parserList = new ArrayList(); + AiLocationVO parserVO; + String[] arr_bb_brp; + String[] arr_bb_tlp; + String[] arr_cc_id; + String[] arr_crd_frm; + String[] arr_crd_glbl; + + LogMsgParserVO logVO; + ElasticMsgHeader logHeader; + + for( ElasticResultMsgVO mv : logMsgs){ + + String sMsg = mv.getMessage(); + + logVO = new LogMsgParserVO(); + + String[] split_Div = pUtile.splitString(sMsg, pUtile.DIV_PIPE); + + /*** 메시지 Header 변환 START ***/ + String[] split_Header = pUtile.splitString(split_Div[0], pUtile.DIV_COMMA); + + logHeader = new ElasticMsgHeader(); + logHeader.setLog_dt(split_Header[0]); + logHeader.setLog_se(split_Header[1]); + logHeader.setSw_se(split_Header[2]); + logHeader.setServer_se(split_Header[3]); + + logVO.setHeader(logHeader); + /*** 메시지 Header 변환 END ***/ + + /*** 메시지 data(body) 변환 START ***/ + String sDatas = split_Div[1]; + + String[] split_Data = null; + + //Data부 여러줄 인지 확인 + int iDivCnt_Datas = pUtile.countDivInMsg(sDatas, pUtile.DIV_CARET); + + // Data부 여러줄인경우 분리(^) + if(iDivCnt_Datas > 0){ + split_Data = pUtile.splitString(sDatas, pUtile.DIV_CARET); + }else{ + split_Data = new String[1]; + split_Data[0] = sDatas; + } + + /**** Data부 한줄씩 처리 START ****/ + for(String loop1Data : split_Data){ + + parserVO = new AiLocationVO(); + + // 일반 필드 분리(,) + String[] split_Field = pUtile.splitString(loop1Data, pUtile.DIV_COMMA); + + + // routeVO.setMv_id(split_Field[0]); + // routeVO.setTrgt_id(split_Field[1]); + // routeVO.setMv_type(split_Field[2]); + // routeVO.setDep_arr_ty(split_Field[3]); + + // routeVO.setMv_point(new ArrayList()); + + String[] split_List = pUtile.splitString(split_Field[4], pUtile.DIV_DOLLAR); + + for(String loopList : split_List){ + + // routePoints = new RoutePoints(); + + String[] split_Array = pUtile.splitString(loopList, pUtile.DIV_AT); + + // routePoints.setSpot_sn(split_Array[0]); + // routePoints.setLat(split_Array[1]); + // routePoints.setLon(split_Array[2]); + + // routeVO.getMv_point().add(routePoints); + + } + + parserList.add(parserVO); + } + /**** Data부 한줄씩 처리 END ****/ + + logVO.setData(parserList); + /*** 메시지 data(body) 변환 END ***/ + + // Que에 파싱 데이터 담기 + parserAiLocQ.offer(logVO) ; + + } // for( ElasticResultMsgVO mv : logMsgs){... END + + + + } + + + + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/parser/ReplayLogParser_Route.java b/src/main/java/kr/gmtc/gw/elastic/parser/ReplayLogParser_Route.java new file mode 100644 index 0000000..1c67741 --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/parser/ReplayLogParser_Route.java @@ -0,0 +1,127 @@ +package kr.gmtc.gw.elastic.parser; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; + +import kr.gmtc.gw.elastic.utils.LogMsgParserUtile; +import kr.gmtc.gw.elastic.vo.ElasticMsgHeader; +import kr.gmtc.gw.elastic.vo.ElasticResultMsgVO; +import kr.gmtc.gw.elastic.vo.LogMsgParserVO; +import kr.gmtc.gw.elastic.vo.ReplayLog.SacpStandRouteVO; +import kr.gmtc.gw.elastic.vo.ReplayLog.SacpStandRouteVO.RoutePoints; + +public class ReplayLogParser_Route { + + private List logMsgs; + + Queue parserRouteQ = new LinkedBlockingQueue(); + + LogMsgParserUtile pUtile; + + public ReplayLogParser_Route(){ + + pUtile = new LogMsgParserUtile(); + + } + + public void logParser(List recvMsgs){ + + this.logMsgs = recvMsgs; + + SacpStandRouteVO routeVO; + RoutePoints routePoints; + + List routeList = new ArrayList(); + + LogMsgParserVO logVO; + ElasticMsgHeader logHeader; + + for( ElasticResultMsgVO mv : logMsgs){ + + String sMsg = mv.getMessage(); + + logVO = new LogMsgParserVO(); + + String[] split_Div = pUtile.splitString(sMsg, pUtile.DIV_PIPE); + + /*** 메시지 Header 변환 START ***/ + String[] split_Header = pUtile.splitString(split_Div[0], pUtile.DIV_COMMA); + + logHeader = new ElasticMsgHeader(); + logHeader.setLog_dt(split_Header[0]); + logHeader.setLog_se(split_Header[1]); + logHeader.setSw_se(split_Header[2]); + logHeader.setServer_se(split_Header[3]); + + logVO.setHeader(logHeader); + /*** 메시지 Header 변환 END ***/ + + /*** 메시지 data(body) 변환 START ***/ + String sDatas = split_Div[1]; + + String[] split_Data = null; + + //Data부 여러줄 인지 확인 + int iDivCnt_Datas = pUtile.countDivInMsg(sDatas, pUtile.DIV_CARET); + + // Data부 여러줄인경우 분리(^) + if(iDivCnt_Datas > 0){ + split_Data = pUtile.splitString(sDatas, pUtile.DIV_CARET); + }else{ + split_Data = new String[1]; + split_Data[0] = sDatas; + } + + /**** Data부 한줄씩 처리 START ****/ + for(String loop1Data : split_Data){ + + routeVO = new SacpStandRouteVO(); + + // 일반 필드 분리(,) + String[] split_Field = pUtile.splitString(loop1Data, pUtile.DIV_COMMA); + + routeVO.setMv_id(split_Field[0]); + routeVO.setTrgt_id(split_Field[1]); + routeVO.setMv_type(split_Field[2]); + routeVO.setDep_arr_ty(split_Field[3]); + + routeVO.setMv_point(new ArrayList()); + + String[] split_List = pUtile.splitString(split_Field[4], pUtile.DIV_DOLLAR); + + for(String loopList : split_List){ + + routePoints = new RoutePoints(); + + String[] split_Array = pUtile.splitString(loopList, pUtile.DIV_AT); + + routePoints.setSpot_sn(split_Array[0]); + routePoints.setLat(split_Array[1]); + routePoints.setLon(split_Array[2]); + + routeVO.getMv_point().add(routePoints); + + } + + routeList.add(routeVO); + } + /**** Data부 한줄씩 처리 END ****/ + + logVO.setData(routeList); + /*** 메시지 data(body) 변환 END ***/ + + // Que에 파싱 데이터 담기 + parserRouteQ.offer(logVO) ; + + } // for( ElasticResultMsgVO mv : logMsgs){... END + + + + } + + + + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/services/ElkSearchService.java b/src/main/java/kr/gmtc/gw/elastic/services/ElkSearchService.java new file mode 100644 index 0000000..256c4ba --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/services/ElkSearchService.java @@ -0,0 +1,140 @@ +package kr.gmtc.gw.elastic.services; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; +import org.springframework.data.elasticsearch.core.query.BaseQuery; +import org.springframework.data.elasticsearch.core.query.Query; +import org.springframework.data.elasticsearch.core.query.StringQuery; +import org.springframework.stereotype.Service; + +import kr.gmtc.gw.elastic.parser.ReplayLogParser_Route; +import kr.gmtc.gw.elastic.vo.ElasticResultMsgVO; + +@Service +public class ElkSearchService { + + private ElasticsearchOperations elasticsearchOperations; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final String INDEX_NAME = "replay_log_*"; + + private List logMsgMatches; + + private ReplayLogParser_Route logParser; + + public ElkSearchService(ElasticsearchOperations elasticsearchOperations){ + this.elasticsearchOperations = elasticsearchOperations; + + logMsgMatches = new ArrayList(); + logParser = new ReplayLogParser_Route(); + + } + + public String elkSearch_replay_log(String sLogType, String sStartDt, String sEndDt) { + + // String sLogType = "3"; // 재생용 로그 S/W구분 + // String sStart_tm = "20240219160000.000"; // 일시(from) + // String sEnd_tm = "20240219170000.000"; // 일시(to) + + List sAfter = null; // 일시(to) + + //logMsgMatches = new ArrayList(); + + String esQuery = "{ " + // + " \"bool\" : { " + // + " \"filter\" : [ " + // + " { \"terms\" : { " + // + " \"header.msg_type.keyword\" : [ " + // + " "+ sLogType +" ] } }, " + // + " { \"range\" : { " + // + " \"header.recv_time\" : { " + // + " \"from\" : \""+ sStartDt +"\", " + // + " \"to\" : \""+ sEndDt +"\" } } } ] } " + // + "}"; + + Query searchQuery = new StringQuery(esQuery); + + // 한번에 가져올 row수 설정 + ((BaseQuery) searchQuery).setMaxResults(1000); + + // 데이터 정렬할 필드 설정 + searchQuery.addSort(Sort.by(new Sort.Order(Sort.Direction.ASC, "header.recv_time.keyword"))); + + LocalDateTime dt_before = LocalDateTime.now(); + + while (true) { + + searchQuery.setSearchAfter(sAfter); + + // 검색 요청하여 검색 결과 가져오기 + SearchHits searchHits = elasticsearchOperations.search(searchQuery, ElasticResultMsgVO.class, IndexCoordinates.of(INDEX_NAME)); + + if (searchHits.getTotalHits() <= 0) break; + + Duration diff = Duration.between(dt_before, LocalDateTime.now()); + + logger.info("elastic Call " + searchHits.getTotalHits() + "건 " + diff.toMillis() + "msec"); + + sAfter = searchHits.toList().get(searchHits.toList().size() -1).getSortValues(); + + // IndexFusion Object에 데이터 담기 + searchHits.forEach(srcHit -> { + logMsgMatches.add(srcHit.getContent()); + }); + + + logger.info("map cnt " + logMsgMatches.size() + "건 " ); + + if (searchHits.toList().size() != 1000) { + logParser.logParser(logMsgMatches); + break; + } + + } + + + return "OK"; + } + +} + + +// POST replay_log_*/_search + // { + // "size" : 10000, + // "track_total_hits": true, + // "query" : { + // "bool" : { + // "filter" : [ + // { + // "terms" : { + // "header.msg_type.keyword" : [ + // 10 + // ] + // } + // }, + // { + // "range" : { + // "header.recv_time" : { + // "from" : "20240416090000.000", + // "to" : "20240416103059.999" + // } + // } + // } + // ] + // } + // }, + // "_source": ["@timestamp", "header", "message"], + // "sort" : [{"header.recv_time.keyword" : {"order" : "ASC"}}], + // "search_after" : ["0"] + // } \ No newline at end of file diff --git a/src/main/java/kr/gmtc/gw/elastic/test/SearchController.java b/src/main/java/kr/gmtc/gw/elastic/test/SearchController.java new file mode 100644 index 0000000..b0a6ccd --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/test/SearchController.java @@ -0,0 +1,40 @@ +package kr.gmtc.gw.elastic.test; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import kr.gmtc.gw.elastic.services.ElkSearchService; + + +@RestController +@RequestMapping("/") +public class SearchController { + + private ElkSearchService elkSearchService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public SearchController(ElkSearchService elkSearchService){ + this.elkSearchService = elkSearchService; + } + + // http://localhost:8080/replay?idx=10&s=20240416090000.000&e=20240416103059.999 + @GetMapping("/replay") + @ResponseBody + public String processSearch_replay_loop(@RequestParam(value = "idx", required = false) String sIndex, + @RequestParam(value = "s", required = false) String sStartDt, + @RequestParam(value = "e", required = false) String sEndDt) { + + logger.info("searching by Index {}", sIndex); + String IndexFusion = elkSearchService.elkSearch_replay_log(sIndex, sStartDt, sEndDt); + + return IndexFusion; + + } + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/utils/LogMsgParserUtile.java b/src/main/java/kr/gmtc/gw/elastic/utils/LogMsgParserUtile.java new file mode 100644 index 0000000..804f1b7 --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/utils/LogMsgParserUtile.java @@ -0,0 +1,29 @@ +package kr.gmtc.gw.elastic.utils; + +public class LogMsgParserUtile { + + public String[] sSplitChar; + + public final int DIV_PIPE = 0; // Data부 시작 구분자(|) + public final int DIV_CARET = 1; // Data부 구분자(^) + public final int DIV_COMMA = 2; // 일반 필드 구분자(,) + public final int DIV_DOLLAR = 3; // 리스트 Row 구분자($) + public final int DIV_AT = 4; // 배열 필드 구분자(@) + + public LogMsgParserUtile(){ + sSplitChar = new String[]{"|", "^", ",", "$", "@"}; + } + + public String[] splitString(String s, int div_num ){ + + return s.split("\\"+ sSplitChar[div_num]); + + } + + public int countDivInMsg(String s, int div_num){ + + return s.indexOf(sSplitChar[div_num]); + } + + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/vo/ElasticMsgHeader.java b/src/main/java/kr/gmtc/gw/elastic/vo/ElasticMsgHeader.java new file mode 100644 index 0000000..1f71ed0 --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/vo/ElasticMsgHeader.java @@ -0,0 +1,15 @@ +package kr.gmtc.gw.elastic.vo; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class ElasticMsgHeader { + + private String log_dt; + private String log_se; + private String sw_se; + private String server_se; + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/vo/ElasticResultMsgVO.java b/src/main/java/kr/gmtc/gw/elastic/vo/ElasticResultMsgVO.java new file mode 100644 index 0000000..c5b997c --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/vo/ElasticResultMsgVO.java @@ -0,0 +1,20 @@ +package kr.gmtc.gw.elastic.vo; + +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ElasticResultMsgVO { + + @Field(type = FieldType.Text, name = "message") + private String message; + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/vo/LogMsgParserVO.java b/src/main/java/kr/gmtc/gw/elastic/vo/LogMsgParserVO.java new file mode 100644 index 0000000..de7b18b --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/vo/LogMsgParserVO.java @@ -0,0 +1,17 @@ +package kr.gmtc.gw.elastic.vo; + +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class LogMsgParserVO { + + private ElasticMsgHeader header; + private List data; + +} + + diff --git a/src/main/java/kr/gmtc/gw/elastic/vo/ReplayLog/AiLocationVO.java b/src/main/java/kr/gmtc/gw/elastic/vo/ReplayLog/AiLocationVO.java new file mode 100644 index 0000000..b1a912f --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/vo/ReplayLog/AiLocationVO.java @@ -0,0 +1,27 @@ +package kr.gmtc.gw.elastic.vo.ReplayLog; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class AiLocationVO { + + private String arcrft_stnd; + private String arcrft_tp; + private String arln; + private String[] arr_bb_brp; + private String[] arr_bb_tlp; + private String[] arr_cc_id; + private String[] arr_crd_frm; + private String[] arr_crd_glbl; + private String drctn; + private String dtct_cls; + private String dtct_tm; + private String mta_tm; + private String rw_tm; + private String spd; + private String trck_id; + private String zn_id; + +} diff --git a/src/main/java/kr/gmtc/gw/elastic/vo/ReplayLog/StandRouteVO.java b/src/main/java/kr/gmtc/gw/elastic/vo/ReplayLog/StandRouteVO.java new file mode 100644 index 0000000..efdf0bd --- /dev/null +++ b/src/main/java/kr/gmtc/gw/elastic/vo/ReplayLog/StandRouteVO.java @@ -0,0 +1,26 @@ +package kr.gmtc.gw.elastic.vo.ReplayLog; + +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class StandRouteVO { + + private String mv_id; + private String trgt_id; + private String mv_type; + private String dep_arr_ty; + private List mv_point; + + @Setter + @Getter + public static class RoutePoints{ + private String spot_sn; + private String lat; + private String lon; + } + +} diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..97652e2 --- /dev/null +++ b/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,42 @@ +{"properties": [ + { + "name": "root", + "type": "java.lang.String", + "description": "A description for 'root'" + }, + { + "name": "asde.filepath1", + "type": "java.lang.String", + "description": "A description for 'asde.filepath1'" + }, + { + "name": "asde.filepath2", + "type": "java.lang.String", + "description": "A description for 'asde.filepath2'" + }, + { + "name": "asde.service", + "type": "java.lang.String", + "description": "A description for 'asde.service'" + }, + { + "name": "asde.service.queueCount", + "type": "java.lang.String", + "description": "A description for 'asde.queueCount'" + }, + { + "name": "asde.service.clearQ.max-count", + "type": "java.lang.String", + "description": "A description for 'asde.clearQ.max-count'" + }, + { + "name": "asde.service.clearQ.diff-time", + "type": "java.lang.String", + "description": "A description for 'asde.clearQ.diff-time'" + }, + { + "name": "asde.service.clearQ.clearTime", + "type": "java.lang.String", + "description": "A description for 'asde.clearQ.clearTime'" + } +]} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..5d43c7b --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,33 @@ +spring: + profiles: + active: default + group: + default: + - winTest + +--- +spring: + config: + activate: + on-profile: default + +server: + port: 8080 + +--- +spring: + config: + activate: + on-profile: real + +--- +spring: + config: + activate: + on-profile: winTest + +app: + config: + elastic: + host: 10.200.31.129 + port: 9200 \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..61c9e22 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + ${LOG_PATTERN} + + + + + + + + + + INFO + + + + ${LOG_PATH}${PATH_SEPARATOR}${LOG_FILE_NAME}.log + + + + ${FILE_LOG_PATTERN} + + + + + + ${LOG_PATH}${PATH_SEPARATOR}%d{yyyyMM,aux}${PATH_SEPARATOR}%d{yyyyMMdd}.log + + 10 + + 10GB + + true + + + + + + + false + 0 + 1024 + true + + + + + + + + + + + + +