### 소스셋팅 - eyegw_core_java 프로젝트 추가 - ApplicationStartup.java 주석처리 -> //import javafx.print.Collation; - Java Compiler -> Annotation Processing -> Factory Path에서 아래 5가지 체크해제 > bootstrap-4.5.1.jar > 나머지는 Source -> repository에서 복붙 > jquery-3.5.1.jar > dist-datatables-1.10.21.jar > jquery-dist-3.5.1.jar > is-buffer-2.0.4.jar - Java 1.8 32bit 적용 --- ### 관련 테이블 > 시설 : TB_FCLTY > 모뎀 : TB_MODEM > 모뎀위치 : TB_MODEM_LC > 모뎀상태이력 : TB_MODEM_STTUS_H > ALE송신현황 : TB_ALE_SEND_STTUS > 미수신 현황 이력 : TB_UNRCV_STTUS_YYYYMM > 선박 : TB_SHIP > 설정 : TB_SETTING > 최종_위치 : TB_LAST_LC > 항적_월별 : TB_TRACK_MM > 최종_위치_이력 : TB_LAST_LC_YYYYMM > 호출_요청 : TB_CALL_REQUST > 수동위치_응답 : TB_PASSIVLC_RSPNS > 수동위치_요청 : TB_PASSIVLC_REQUST > 모뎀상태 : TB_MODEM_STTUS > 모뎀제어 : TB_MODEM_CTRL --- 테스트 정규식 msg console에서 테스트 패킷 추출 : ``` \$SYENC,30.+1,1,1,1\*[0-9]{2} ``` # 소스분석 ## MainController.java ### sendThread - for : process { 미처리 (0), 일부실패재전송(3) } for : msgArr { - 조난응답(14), - 개별/영역호출(16) - 단문자(3) - 수동위치요청(11) - 기상특보(18) - 기상예보(5) - 태풍(6) - 이미지(4) - 채팅(30) } -> send(msgArr, process); - Thread.sleep(sendIntvl); > sendIntvl : 2초 ### checkLastLcThread - for : passivLcSndCnt := 2 -> checkLastLcController.CheckLastLc(min := 30 = min + 30); -> Thread.sleep(10000); // 10분 ### hbThread - 서버 커넥션 체크용 패킷전송 ($HB) #### packetController.makePacket - 프로토콜을 기주능로 각 방송의 패킷 데이터 생성 - return : List\ packet #### checkLastLcThread -> send(2., 1.) 2번 반복 -> sendQue = passivlcController.getPassivlcRequst(process, repeat) -> 20초 sleep (포항,고흥) #### packetMap > key : key = mssage_id+modem_id+totalBlCnt+blNo; > 0 := 요청 패킷데이터 ($SYENC,28,MD203...... ) {packetController.makePacket(MSG_TY,passivlcVO);} > 1 := 실패횟수 **(reTryTimeOut())** > 2 := 데이터조회 일시 (포항,고흥은 +20초) > 3 := table name > 4 := ColumnNm > 5 := 전송대상 모뎀리스트 > 6 := 성공횟수 **(갱신하는부분 확인)** > 7 := Slot_no (추가) #### getMssage_ty (LastLcTrackVO) -- 메시지타입? TB_LAST_LC.MSSAGE_TY 요청 packet 0 := $SYENC, 1 := 28, 2 := MD003, 3 := 0, 4 := 0, 5 := 20220130165331342, 6 := 1, 7 := 1|11, 8 := 20220201150056, 9 := 440224590, 10 := 492, 11 := ARo9S04ewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1BxlnUykm/k=*0E 응답 패킷 $SYENC,30,MD003,0,0,20220130165331341,1,1,1*7F ![[Pasted image 20220419180044.png]] ___ # 로직 분석 ## 공통 #### 메시지 발송 순서 - 각 메시지 신규전송 1회씩 - 이후 일부실패재전송 1회씩 - 전송이후 2초 sleep ## 수동위치요청 (11) - PROCESS = 0인 자료중 MSSAGE_ID로 정렬하여 1건 조회 - 대상모뎀컬럼 데이터가 없으면 실패처리 ( PROCESS := 9) - 처리중으로 업데이트 ( PROCESS := 1) - 조회한 데이터로 Packet 생성 - packetMap.put(...) [[EyeSV_MSG#^b72528]] > 데이터 조회 일시 가공 : 포항, 고흥에 20초씩 추가 - passivlcQue에 패킷데이터 추가 (모뎀별 1~ 6개) - 포항, 고흥인경우 20초 sleep 후 패킷전송 --- # 배포 CORE - SettingVO.java [gmt.proj.sv_msg.vo] - PassivlcVO.java [gmt.proj.sv_msg.vo] MSG - MainController.java - PassivlcController.java [kr.gmtc.eyesvmsg.send.passivlc] - Db5Mapper.java [kr.gmtc.eyesvmsg.mapper.dao5] - PassivlcService.java [kr.gmtc.eyesvmsg.send.passivlc] - CheckLastLcController.java [kr.gmtc.eyesvmsg.send.passivlc] - Db5.xml [src/main/resources] - SpecialNewsService.java [kr.gmtc.eyesvmsg.send.specialnews] - WeatherService.java [kr.gmtc.eyesvmsg.send.weather] - TyphnService.java [kr.gmtc.eyesvmsg.send.typhoon] DB ### 상황관제시스템 API 쿼리 튜닝 #### 송신현황 관련 오브젝트 생성 및 컴파일 ```SQL /*Index 생성*/ CREATE INDEX idx_TB_SMS_SND_indt ON TB_SMS_SND(insert_dt); CREATE INDEX idx_TB_ALE_SEND_STTUS_snddt ON TB_ALE_SEND_STTUS(SND_DT); CREATE INDEX idx_TB_SPECIALNEWS_indt ON TB_SPECIALNEWS(insert_dt); CREATE INDEX idx_TB_WETHR_SND_M_indt ON TB_WETHR_SND_M(insert_dt); CREATE INDEX idx_TB_TYPHN_SND_M_indt ON TB_TYPHN_SND_M(insert_dt); CREATE INDEX idx_TB_PASSIVLC_REQUST_indt ON TB_PASSIVLC_REQUST(insert_dt); CREATE INDEX idx_TB_SMS_SND_indt ON TB_SMS_SND(insert_dt); CREATE INDEX idx_TB_DSAST_RSPNS_indt ON TB_DSAST_RSPNS(insert_dt); CREATE INDEX idx_TB_CALL_REQUST_indt ON TB_CALL_REQUST(MSSAGE_TY, insert_dt); ```