Deliver 기능 수정, msgid 관리 큐 수정
@48c5207d058447f49d3959c39ba8d909991e075c
--- src/main/java/com/munjaon/server/api/controller/MessageController.java
... | ... | @@ -1,34 +0,0 @@ |
| 1 | -package com.munjaon.server.api.controller; | |
| 2 | - | |
| 3 | -import com.munjaon.server.api.dto.base.ApiResponse; | |
| 4 | -import com.munjaon.server.queue.dto.BasicMessageDto; | |
| 5 | -import com.munjaon.server.queue.enums.QueueTypeWorker; | |
| 6 | -import lombok.RequiredArgsConstructor; | |
| 7 | -import lombok.extern.slf4j.Slf4j; | |
| 8 | -import org.apache.commons.configuration2.ex.ConfigurationException; | |
| 9 | -import org.springframework.http.HttpStatus; | |
| 10 | -import org.springframework.http.ResponseEntity; | |
| 11 | -import org.springframework.web.bind.annotation.PostMapping; | |
| 12 | -import org.springframework.web.bind.annotation.RequestBody; | |
| 13 | -import org.springframework.web.bind.annotation.RequestMapping; | |
| 14 | -import org.springframework.web.bind.annotation.RestController; | |
| 15 | - | |
| 16 | -@Slf4j | |
| 17 | -@RequestMapping("/api/message") | |
| 18 | -@RestController | |
| 19 | -@RequiredArgsConstructor | |
| 20 | -public class MessageController { | |
| 21 | - @PostMapping("/save") | |
| 22 | - public ResponseEntity postSample(@RequestBody BasicMessageDto reqDto) throws ConfigurationException { | |
| 23 | - log.debug("BasicMessageDto : {}", reqDto); | |
| 24 | - if (reqDto.getServiceType() != null && reqDto.getServiceType().equals("4")) { | |
| 25 | - QueueTypeWorker worker = QueueTypeWorker.find("SMS"); | |
| 26 | - if (worker != null) { | |
| 27 | - log.debug("queue size : {}", worker.isExistQueue("SMS01")); | |
| 28 | - worker.pushQueue(reqDto); | |
| 29 | - } | |
| 30 | - } | |
| 31 | - | |
| 32 | - return new ResponseEntity(ApiResponse.toResponse(200, "OK", reqDto), HttpStatus.OK); | |
| 33 | - } | |
| 34 | -} |
--- src/main/java/com/munjaon/server/api/controller/SampleController.java
... | ... | @@ -1,33 +0,0 @@ |
| 1 | -package com.munjaon.server.api.controller; | |
| 2 | - | |
| 3 | -import com.munjaon.server.api.dto.SampleDto; | |
| 4 | -import com.munjaon.server.api.dto.base.ApiResponse; | |
| 5 | -import com.munjaon.server.api.service.SampleService; | |
| 6 | -import lombok.RequiredArgsConstructor; | |
| 7 | -import lombok.extern.slf4j.Slf4j; | |
| 8 | -import org.apache.commons.configuration2.ex.ConfigurationException; | |
| 9 | -import org.springframework.http.HttpStatus; | |
| 10 | -import org.springframework.http.ResponseEntity; | |
| 11 | -import org.springframework.web.bind.annotation.PostMapping; | |
| 12 | -import org.springframework.web.bind.annotation.RequestBody; | |
| 13 | -import org.springframework.web.bind.annotation.RequestMapping; | |
| 14 | -import org.springframework.web.bind.annotation.RestController; | |
| 15 | - | |
| 16 | -@Slf4j | |
| 17 | -@RequestMapping("/api") | |
| 18 | -@RestController | |
| 19 | -@RequiredArgsConstructor | |
| 20 | -public class SampleController { | |
| 21 | - private final SampleService sampleService; | |
| 22 | - | |
| 23 | - @PostMapping("/sample") | |
| 24 | - public ResponseEntity postSample(@RequestBody SampleDto sample) throws ConfigurationException { | |
| 25 | - log.debug("sample : {}", sampleService.get()); | |
| 26 | - System.out.println("command : " + sample.getCommand()); | |
| 27 | - | |
| 28 | - /* 설정 Load */ | |
| 29 | - sampleService.printConfig(); | |
| 30 | - | |
| 31 | - return new ResponseEntity(ApiResponse.toResponse(200, "OK", sample), HttpStatus.OK); | |
| 32 | - } | |
| 33 | -} |
--- src/main/java/com/munjaon/server/api/dto/SampleDto.java
... | ... | @@ -1,12 +0,0 @@ |
| 1 | -package com.munjaon.server.api.dto; | |
| 2 | - | |
| 3 | -import com.munjaon.server.api.dto.base.BaseDto; | |
| 4 | -import lombok.Getter; | |
| 5 | -import lombok.Setter; | |
| 6 | -import lombok.ToString; | |
| 7 | - | |
| 8 | -@Getter | |
| 9 | -@Setter | |
| 10 | -@ToString | |
| 11 | -public class SampleDto extends BaseDto { | |
| 12 | -} |
--- src/main/java/com/munjaon/server/api/dto/base/ApiResponse.java
... | ... | @@ -1,31 +0,0 @@ |
| 1 | -package com.munjaon.server.api.dto.base; | |
| 2 | - | |
| 3 | -import lombok.AllArgsConstructor; | |
| 4 | -import lombok.Builder; | |
| 5 | -import lombok.Data; | |
| 6 | -import lombok.NoArgsConstructor; | |
| 7 | - | |
| 8 | -@Data | |
| 9 | -@AllArgsConstructor | |
| 10 | -@NoArgsConstructor | |
| 11 | -@Builder | |
| 12 | -public class ApiResponse<T> { | |
| 13 | - /* 응답코드 */ | |
| 14 | - private Integer code; | |
| 15 | - /* 응답 메시지 */ | |
| 16 | - private String message; | |
| 17 | - /* Response 객체 */ | |
| 18 | - private T data; | |
| 19 | - | |
| 20 | - public ApiResponse(final Integer code, final String message) { | |
| 21 | - this.code = code; | |
| 22 | - this.message = message; | |
| 23 | - } | |
| 24 | - | |
| 25 | - public static <T> ApiResponse<T> toResponse(final Integer code, final String message, final T t) { | |
| 26 | - return ApiResponse.<T>builder().code(code) | |
| 27 | - .message(message) | |
| 28 | - .data(t) | |
| 29 | - .build(); | |
| 30 | - } | |
| 31 | -} |
--- src/main/java/com/munjaon/server/api/dto/base/BaseDto.java
... | ... | @@ -1,13 +0,0 @@ |
| 1 | -package com.munjaon.server.api.dto.base; | |
| 2 | - | |
| 3 | -import lombok.Getter; | |
| 4 | -import lombok.Setter; | |
| 5 | -import lombok.ToString; | |
| 6 | - | |
| 7 | -@Getter | |
| 8 | -@Setter | |
| 9 | -@ToString | |
| 10 | -public class BaseDto { | |
| 11 | - protected String command; | |
| 12 | - protected String authKey; | |
| 13 | -} |
--- src/main/java/com/munjaon/server/api/mapper/SampleMapper.java
... | ... | @@ -1,8 +0,0 @@ |
| 1 | -package com.munjaon.server.api.mapper; | |
| 2 | - | |
| 3 | -import org.apache.ibatis.annotations.Mapper; | |
| 4 | - | |
| 5 | -@Mapper | |
| 6 | -public interface SampleMapper { | |
| 7 | - int get(); | |
| 8 | -} |
--- src/main/java/com/munjaon/server/api/service/SampleService.java
... | ... | @@ -1,31 +0,0 @@ |
| 1 | -package com.munjaon.server.api.service; | |
| 2 | - | |
| 3 | -import com.munjaon.server.api.mapper.SampleMapper; | |
| 4 | -import com.munjaon.server.cache.service.MemberService; | |
| 5 | -import com.munjaon.server.config.ServerConfig; | |
| 6 | -import lombok.RequiredArgsConstructor; | |
| 7 | -import lombok.extern.slf4j.Slf4j; | |
| 8 | -import org.apache.commons.configuration2.ex.ConfigurationException; | |
| 9 | -import org.springframework.stereotype.Service; | |
| 10 | - | |
| 11 | -@Slf4j | |
| 12 | -@Service | |
| 13 | -@RequiredArgsConstructor | |
| 14 | -public class SampleService { | |
| 15 | - private final SampleMapper sampleMapper; | |
| 16 | - | |
| 17 | - private final ServerConfig serverConfig; | |
| 18 | - | |
| 19 | - private final MemberService memberService; | |
| 20 | - | |
| 21 | - public int get() { | |
| 22 | - return sampleMapper.get(); | |
| 23 | - } | |
| 24 | - | |
| 25 | - public void printConfig() throws ConfigurationException { | |
| 26 | - log.info("server.run : {}", serverConfig.getString("server.run")); | |
| 27 | - log.info("sms.queue.count : {}", serverConfig.getInt("sms.queue.count")); | |
| 28 | - log.info("member list : {}", memberService.list()); | |
| 29 | - log.info("member get : {}", memberService.get("006star")); | |
| 30 | - } | |
| 31 | -} |
--- src/main/java/com/munjaon/server/config/RunnerConfiguration.java
+++ src/main/java/com/munjaon/server/config/RunnerConfiguration.java
... | ... | @@ -257,8 +257,8 @@ |
| 257 | 257 |
try {
|
| 258 | 258 |
String serviceName = "REPORTER"; |
| 259 | 259 |
int port = serverConfig.getInt(serviceName + ".SERVICE_PORT"); |
| 260 |
- ReportServerService reportServerService = new ReportServerService(serviceName, port); |
|
| 261 |
- reportServerService.start(); |
|
| 260 |
+ ReportServer reportServer = new ReportServer(serviceName, port); |
|
| 261 |
+ reportServer.start(); |
|
| 262 | 262 |
} catch (Exception e) {
|
| 263 | 263 |
throw new RuntimeException(e); |
| 264 | 264 |
} |
--- src/main/java/com/munjaon/server/queue/pool/SerialQueue.java
+++ src/main/java/com/munjaon/server/queue/pool/SerialQueue.java
... | ... | @@ -1,6 +1,7 @@ |
| 1 | 1 |
package com.munjaon.server.queue.pool; |
| 2 | 2 |
|
| 3 | 3 |
import com.munjaon.server.queue.config.QueueConstants; |
| 4 |
+import com.munjaon.server.server.service.PropertyLoader; |
|
| 4 | 5 |
import com.munjaon.server.util.FileUtil; |
| 5 | 6 |
import lombok.Getter; |
| 6 | 7 |
|
... | ... | @@ -47,7 +48,11 @@ |
| 47 | 48 |
this.channel = new RandomAccessFile(file, "rw").getChannel(); |
| 48 | 49 |
|
| 49 | 50 |
if (file.length() == 0) {
|
| 50 |
- serialNo = 0L; |
|
| 51 |
+ String msgid = PropertyLoader.getProp("SERIAL_QUEUE", "MSGID");
|
|
| 52 |
+ if (msgid == null) {
|
|
| 53 |
+ msgid = "0"; |
|
| 54 |
+ } |
|
| 55 |
+ serialNo = Long.parseLong(msgid); |
|
| 51 | 56 |
// 헤더 초기화 |
| 52 | 57 |
writeData(); |
| 53 | 58 |
} else {
|
--- src/main/java/com/munjaon/server/server/service/PropertyLoader.java
+++ src/main/java/com/munjaon/server/server/service/PropertyLoader.java
... | ... | @@ -33,7 +33,7 @@ |
| 33 | 33 |
value = value.replaceAll("\\$WORK_HOME", System.getProperty("WORK_HOME"));
|
| 34 | 34 |
} |
| 35 | 35 |
|
| 36 |
- return value; |
|
| 36 |
+ return value == null ? null : value.trim(); |
|
| 37 | 37 |
} |
| 38 | 38 |
|
| 39 | 39 |
public synchronized static Properties load() {
|
--- src/main/java/com/munjaon/server/server/service/ReportServer.java
+++ src/main/java/com/munjaon/server/server/service/ReportServer.java
... | ... | @@ -1,9 +1,9 @@ |
| 1 | 1 |
package com.munjaon.server.server.service; |
| 2 | 2 |
|
| 3 | 3 |
import com.munjaon.server.queue.pool.ReportQueue; |
| 4 |
-import com.munjaon.server.server.dto.ConnectUserDto; |
|
| 5 | 4 |
import com.munjaon.server.server.dto.ReportUserDto; |
| 6 | 5 |
import com.munjaon.server.server.queue.ReportUserQueue; |
| 6 |
+import com.munjaon.server.server.task.ReportServerTask; |
|
| 7 | 7 |
import org.json.simple.JSONObject; |
| 8 | 8 |
|
| 9 | 9 |
import java.io.File; |
... | ... | @@ -100,6 +100,8 @@ |
| 100 | 100 |
if (reportUserDto == null || reportUserDto.isRunningMode()) {
|
| 101 | 101 |
continue; |
| 102 | 102 |
} |
| 103 |
+ /* 사용자별 Report Thread 실행 */ |
|
| 104 |
+ new ReportServerTask(selector, key, getName(), logger).run(); |
|
| 103 | 105 |
} else {
|
| 104 | 106 |
ReportQueue reportQueue = reportUserDto.getReportQueue(); |
| 105 | 107 |
if (reportUserDto.isLogin() && reportQueue != null && reportQueue.isRemainReport()) {
|
... | ... | @@ -107,6 +109,7 @@ |
| 107 | 109 |
continue; |
| 108 | 110 |
} |
| 109 | 111 |
/* 사용자별 Report Thread 실행 */ |
| 112 |
+ new ReportServerTask(selector, key, getName(), logger).run(); |
|
| 110 | 113 |
} |
| 111 | 114 |
} |
| 112 | 115 |
} else {
|
... | ... | @@ -135,9 +138,14 @@ |
| 135 | 138 |
if (reportUserDto == null || reportUserDto.isRunningMode()) {
|
| 136 | 139 |
continue; |
| 137 | 140 |
} |
| 138 |
- saveSystemLog("isReadable");
|
|
| 141 |
+ if (reportUserDto.isLogin()) {
|
|
| 142 |
+ saveSystemLog("[REPORT SERVER READ] [ID : " + reportUserDto.getUserId() + "]");
|
|
| 143 |
+ } else {
|
|
| 144 |
+ saveSystemLog("[REPORT SERVER READ] [FIRST CONNECTION ... ... ... ... ... ... ...]");
|
|
| 145 |
+ } |
|
| 146 |
+ reportUserDto.setRunningMode(true); |
|
| 139 | 147 |
/* 사용자별 Report Thread 실행 */ |
| 140 |
-// threadService.submit(selector, key, 2); |
|
| 148 |
+ new ReportServerTask(selector, key, getName(), logger).run(); |
|
| 141 | 149 |
} |
| 142 | 150 |
} else {
|
| 143 | 151 |
expireConnectUser(key); |
... | ... | @@ -169,7 +177,8 @@ |
| 169 | 177 |
} |
| 170 | 178 |
try {
|
| 171 | 179 |
SocketChannel channel = (SocketChannel) key.channel(); |
| 172 |
- ConnectUserDto userDto = (ConnectUserDto) key.attachment(); |
|
| 180 |
+ ReportUserDto userDto = (ReportUserDto) key.attachment(); |
|
| 181 |
+ saveSystemLog("Expire connect user: " + userDto);
|
|
| 173 | 182 |
if (userDto != null && userDto.getUserId() != null) {
|
| 174 | 183 |
reportUserQueue.removeUser(userDto.getUserId()); |
| 175 | 184 |
// connectUserMap.remove(userDto.getUserId()); |
--- src/main/java/com/munjaon/server/server/task/CollectServerTask.java
+++ src/main/java/com/munjaon/server/server/task/CollectServerTask.java
... | ... | @@ -40,7 +40,7 @@ |
| 40 | 40 |
private long RUN_FLAG_CHECK_TIME; |
| 41 | 41 |
|
| 42 | 42 |
/* 클라이언트 요청 데이터 수신 */ |
| 43 |
- |
|
| 43 |
+ private ByteBuffer headBuffer = ByteBuffer.allocateDirect(Header.HEADER_LENGTH); |
|
| 44 | 44 |
/* 세션이 만료되었는지 체크 */ |
| 45 | 45 |
private boolean isExpiredYn; |
| 46 | 46 |
|
... | ... | @@ -75,53 +75,74 @@ |
| 75 | 75 |
return IS_SERVER_RUN && IS_RUN_YN; |
| 76 | 76 |
} |
| 77 | 77 |
|
| 78 |
+ /* 로그 헤더 생성 */ |
|
| 79 |
+ private String printTaskLog() {
|
|
| 80 |
+ StringBuilder builder = new StringBuilder(); |
|
| 81 |
+ builder.append("[CollectServerTask]");
|
|
| 82 |
+ builder.append("[SERVICE_TYPE : ").append(serviceType).append("]");
|
|
| 83 |
+ if (connectUserDto.isLogin()) {
|
|
| 84 |
+ builder.append("[ID : ").append(connectUserDto.getUserId()).append("]");
|
|
| 85 |
+ } else {
|
|
| 86 |
+ builder.append("[FIRST CONNECTION ... ... ... ... ... ... ...]");
|
|
| 87 |
+ } |
|
| 88 |
+ |
|
| 89 |
+ return builder.toString(); |
|
| 90 |
+ } |
|
| 91 |
+ |
|
| 92 |
+ private void initHeaderBuffer() {
|
|
| 93 |
+ this.headBuffer.clear(); |
|
| 94 |
+ for (int loopCnt = 0; loopCnt < Header.HEADER_LENGTH; loopCnt++) {
|
|
| 95 |
+ this.headBuffer.put(Packet.SET_DEFAULT_BYTE); |
|
| 96 |
+ } |
|
| 97 |
+ this.headBuffer.position(0); |
|
| 98 |
+ } |
|
| 99 |
+ |
|
| 100 |
+ private int readHeader() {
|
|
| 101 |
+ initHeaderBuffer(); |
|
| 102 |
+ int size = -1; |
|
| 103 |
+ try {
|
|
| 104 |
+ size = channel.read(headBuffer); |
|
| 105 |
+ } catch (IOException e) {
|
|
| 106 |
+ throw new RuntimeException(e); |
|
| 107 |
+ } |
|
| 108 |
+ |
|
| 109 |
+ return size; |
|
| 110 |
+ } |
|
| 111 |
+ |
|
| 78 | 112 |
@Override |
| 79 | 113 |
public void run() {
|
| 80 |
- saveSystemLog("CollectServerTask is Entered");
|
|
| 81 |
- /* 최초 RUN Flag 체크 */ |
|
| 114 |
+ saveSystemLog(printTaskLog() + "[### Start ### ### ### ### ### ### ###]"); |
|
| 115 |
+ /* 0. 최초 RUN Flag 체크 */ |
|
| 82 | 116 |
reloadRunFlag(); |
| 83 | 117 |
/* BIND 체크 및 처리 */ |
| 84 | 118 |
while (isRun()) {
|
| 85 |
- /* 만료 여부 체크 */ |
|
| 119 |
+ /* 1. 만료 여부 체크 */ |
|
| 86 | 120 |
if (isExpiredYn) {
|
| 87 | 121 |
break; |
| 88 | 122 |
} |
| 89 |
- |
|
| 90 |
- int size = -1; |
|
| 91 | 123 |
try {
|
| 92 |
- /* 1. Head 읽기 */ |
|
| 93 |
- ByteBuffer headBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH); |
|
| 94 |
- try {
|
|
| 95 |
- size = channel.read(headBuffer); |
|
| 96 |
- } catch (IOException e) {}
|
|
| 97 |
- /* 2. Body 읽기 */ |
|
| 124 |
+ /* 3. HeadBuffer 읽기 */ |
|
| 125 |
+ int size = readHeader(); |
|
| 126 |
+ /* 4. Body 읽기 */ |
|
| 98 | 127 |
if (size > 0) {
|
| 99 | 128 |
String command = Header.getCommand(headBuffer); |
| 100 | 129 |
switch (Integer.parseInt(command)) {
|
| 101 |
- case 1: |
|
| 102 |
- recvBind(channel, headBuffer); |
|
| 103 |
- break; |
|
| 104 |
- case 3: |
|
| 105 |
- recvDeliver(channel, headBuffer); |
|
| 106 |
- break; |
|
| 107 |
- case 7: |
|
| 108 |
- recvLinkCheck(channel); |
|
| 109 |
- break; |
|
| 110 |
- default: |
|
| 111 |
- expireConnectUser(); |
|
| 112 |
- break; |
|
| 130 |
+ case 1: recvBind(channel, headBuffer); break; |
|
| 131 |
+ case 3: recvDeliver(channel, headBuffer); break; |
|
| 132 |
+ case 7: recvLinkCheck(channel); break; |
|
| 133 |
+ default: expireConnectUser(); break; |
|
| 113 | 134 |
} |
| 114 | 135 |
} else if (size == 0) {
|
| 115 |
- Thread.sleep(1); |
|
| 116 | 136 |
if (System.currentTimeMillis() - connectUserDto.getLastTrafficTime() > ServerConfig.DELIVER_EXEC_CYCLE_TIME) {
|
| 117 | 137 |
this.isExpiredYn = true; |
| 118 | 138 |
} |
| 139 |
+ Thread.sleep(1); |
|
| 119 | 140 |
} else {
|
| 120 | 141 |
expireConnectUser(); |
| 121 | 142 |
} |
| 122 |
- |
|
| 123 | 143 |
} catch (Exception e) {
|
| 124 |
- size = -1; |
|
| 144 |
+ /* 세션 만료 여부 */ |
|
| 145 |
+ this.isExpiredYn = true; |
|
| 125 | 146 |
e.printStackTrace(); |
| 126 | 147 |
} |
| 127 | 148 |
/* RUN Flag 체크 */ |
... | ... | @@ -129,31 +150,22 @@ |
| 129 | 150 |
} |
| 130 | 151 |
/* 중요 : 사용자 Thread 실행모드 Off */ |
| 131 | 152 |
connectUserDto.setRunningMode(false); |
| 132 |
- saveSystemLog("CollectServerTask is Finished");
|
|
| 153 |
+ saveSystemLog(printTaskLog() + "[### End ### ### ### ### ### ### ###]"); |
|
| 133 | 154 |
} |
| 134 | 155 |
|
| 135 | 156 |
private void recvDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
|
| 136 | 157 |
/* 서비스 중지여부 체크 */ |
| 137 | 158 |
if (isExpireService()) {
|
| 138 | 159 |
expireConnectUser(); |
| 160 |
+ saveSystemLog(printTaskLog() + "[isExpireService : Expired ... ... ... ... ... ... ...]"); |
|
| 139 | 161 |
return; |
| 140 | 162 |
} |
| 141 | 163 |
switch (this.serviceType) {
|
| 142 |
- case "SMS": |
|
| 143 |
- recvSmsDeliver(channel, headBuffer); |
|
| 144 |
- break; |
|
| 145 |
- case "LMS": |
|
| 146 |
- recvLmsDeliver(channel, headBuffer); |
|
| 147 |
- break; |
|
| 148 |
- case "MMS": |
|
| 149 |
- recvMmsDeliver(channel, headBuffer); |
|
| 150 |
- break; |
|
| 151 |
- case "KAT": |
|
| 152 |
- recvKatDeliver(channel, headBuffer); |
|
| 153 |
- break; |
|
| 154 |
- case "KFT": |
|
| 155 |
- recvKftDeliver(channel, headBuffer); |
|
| 156 |
- break; |
|
| 164 |
+ case "SMS": recvSmsDeliver(channel, headBuffer); break; |
|
| 165 |
+ case "LMS": recvLmsDeliver(channel, headBuffer); break; |
|
| 166 |
+ case "MMS": recvMmsDeliver(channel, headBuffer); break; |
|
| 167 |
+ case "KAT": recvKatDeliver(channel, headBuffer); break; |
|
| 168 |
+ case "KFT": recvKftDeliver(channel, headBuffer); break; |
|
| 157 | 169 |
default:break; |
| 158 | 170 |
} |
| 159 | 171 |
} |
... | ... | @@ -161,7 +173,6 @@ |
| 161 | 173 |
private boolean isExpireService() {
|
| 162 | 174 |
ConnectUserDto checkConnectUserDto = collectUserQueue.getUser(this.serviceType, this.connectUserDto.getUserId()); |
| 163 | 175 |
MemberDto memberDto = checkConnectUserDto.getMemberDto(); |
| 164 |
- saveSystemLog("[isExpireService : " + memberDto.toString() + "]");
|
|
| 165 | 176 |
if (memberDto == null) {
|
| 166 | 177 |
return true; |
| 167 | 178 |
} |
... | ... | @@ -233,7 +244,7 @@ |
| 233 | 244 |
messageDto.setUnitCost(String.valueOf(savedMemberDto.getShortPrice())); |
| 234 | 245 |
} |
| 235 | 246 |
|
| 236 |
- saveLog("[SMS] [MESSAGE : " + messageDto.toString() + "]");
|
|
| 247 |
+ saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]"); |
|
| 237 | 248 |
QueueTypeWorker worker = QueueTypeWorker.find("SMS");
|
| 238 | 249 |
if (worker != null) {
|
| 239 | 250 |
worker.pushQueue(messageDto); |
... | ... | @@ -266,7 +277,7 @@ |
| 266 | 277 |
messageDto.setUnitCost(String.valueOf(savedMemberDto.getLongPrice())); |
| 267 | 278 |
} |
| 268 | 279 |
|
| 269 |
- saveSystemLog("[LMS] [MESSAGE : " + messageDto.toString() + "]");
|
|
| 280 |
+ saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]"); |
|
| 270 | 281 |
QueueTypeWorker worker = QueueTypeWorker.find("LMS");
|
| 271 | 282 |
if (worker != null) {
|
| 272 | 283 |
worker.pushQueue(messageDto); |
... | ... | @@ -315,7 +326,7 @@ |
| 315 | 326 |
} else if (i == 2) {
|
| 316 | 327 |
messageDto.setUserFileName03(imagePath + File.separator + fileName); |
| 317 | 328 |
} |
| 318 |
- saveSystemLog("[MMS IMAGE] [File : " + fileName + ", Size : " + fileSize + "]");
|
|
| 329 |
+ saveSystemLog(printTaskLog() + "[MMS IMAGE] [File : " + fileName + ", Size : " + fileSize + "]"); |
|
| 319 | 330 |
} |
| 320 | 331 |
|
| 321 | 332 |
/* 사용자 단가, 발송망 설정 */ |
... | ... | @@ -336,7 +347,7 @@ |
| 336 | 347 |
messageDto.setUnitCost(String.valueOf(mmsPrice)); |
| 337 | 348 |
} |
| 338 | 349 |
|
| 339 |
- saveSystemLog("[MMS] [MESSAGE : " + messageDto.toString() + "]");
|
|
| 350 |
+ saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]"); |
|
| 340 | 351 |
QueueTypeWorker worker = QueueTypeWorker.find("MMS");
|
| 341 | 352 |
if (worker != null) {
|
| 342 | 353 |
worker.pushQueue(messageDto); |
... | ... | @@ -377,7 +388,7 @@ |
| 377 | 388 |
JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer); |
| 378 | 389 |
|
| 379 | 390 |
messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName); |
| 380 |
- saveSystemLog("[KAT JSON] [File : " + fileName + ", Size : " + fileSize + "]");
|
|
| 391 |
+ saveSystemLog(printTaskLog() + "[KAT JSON] [File : " + fileName + ", Size : " + fileSize + "]"); |
|
| 381 | 392 |
|
| 382 | 393 |
/* 사용자 단가, 발송망 설정 */ |
| 383 | 394 |
MemberDto savedMemberDto = null; |
... | ... | @@ -389,7 +400,7 @@ |
| 389 | 400 |
messageDto.setUnitCost(String.valueOf(savedMemberDto.getKakaoAtPrice())); |
| 390 | 401 |
} |
| 391 | 402 |
|
| 392 |
- saveSystemLog("[KAKAO ALARM] [MESSAGE : " + messageDto.toString() + "]");
|
|
| 403 |
+ saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]"); |
|
| 393 | 404 |
QueueTypeWorker worker = QueueTypeWorker.find("KAT");
|
| 394 | 405 |
if (worker != null) {
|
| 395 | 406 |
worker.pushQueue(messageDto); |
... | ... | @@ -432,7 +443,7 @@ |
| 432 | 443 |
JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer); |
| 433 | 444 |
|
| 434 | 445 |
messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName); |
| 435 |
- saveSystemLog("[KFT JSON] [File : " + fileName + ", Size : " + fileSize + "]");
|
|
| 446 |
+ saveSystemLog(printTaskLog() + "[KFT JSON] [File : " + fileName + ", Size : " + fileSize + "]"); |
|
| 436 | 447 |
|
| 437 | 448 |
/* 사용자 단가, 발송망 설정 */ |
| 438 | 449 |
MemberDto savedMemberDto = null; |
... | ... | @@ -444,7 +455,7 @@ |
| 444 | 455 |
messageDto.setUnitCost(String.valueOf(savedMemberDto.getKakaoFtPrice())); |
| 445 | 456 |
} |
| 446 | 457 |
|
| 447 |
- saveSystemLog("[KAKAO FRIEND] [MESSAGE : " + messageDto.toString() + "]");
|
|
| 458 |
+ saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]"); |
|
| 448 | 459 |
QueueTypeWorker worker = QueueTypeWorker.find("KFT");
|
| 449 | 460 |
if (worker != null) {
|
| 450 | 461 |
worker.pushQueue(messageDto); |
... | ... | @@ -485,7 +496,7 @@ |
| 485 | 496 |
if (svc != null) {
|
| 486 | 497 |
memberDto = svc.get(id); |
| 487 | 498 |
} |
| 488 |
- saveSystemLog("[BIND REQUEST] [ID : " + id + ", PWD : " + pwd + "]");
|
|
| 499 |
+ saveSystemLog(printTaskLog() + "[BIND REQUEST] [ID : " + id + ", PWD : " + pwd + "]"); |
|
| 489 | 500 |
/* Bind Check */ |
| 490 | 501 |
resultCode = checkBind(memberDto, this.serviceType, id, pwd); |
| 491 | 502 |
|
... | ... | @@ -493,9 +504,9 @@ |
| 493 | 504 |
if ("00".equals(resultCode)) {
|
| 494 | 505 |
boolean isPermit = false; |
| 495 | 506 |
if (memberDto.getIpLimitYn() == null || "Y".equals(memberDto.getIpLimitYn())) {
|
| 496 |
- saveSystemLog("connectUserDto.getRemoteIP() : " + connectUserDto.getRemoteIP());
|
|
| 497 |
- saveSystemLog("Customize Toolbar... : " + memberDto.getAllowIpBasic());
|
|
| 498 |
- saveSystemLog("memberDto.getAllowIpExtend() : " + memberDto.getAllowIpExtend());
|
|
| 507 |
+ saveSystemLog(printTaskLog() + "[REMOTE IP : " + connectUserDto.getRemoteIP() + "]"); |
|
| 508 |
+ saveSystemLog(printTaskLog() + "[ALLOW IP BASIC : " + memberDto.getAllowIpBasic() + "]"); |
|
| 509 |
+ saveSystemLog(printTaskLog() + "[ALLOW IP EXTEND : " + memberDto.getAllowIpExtend() + "]"); |
|
| 499 | 510 |
if (memberDto.getAllowIpBasic() != null && connectUserDto.getRemoteIP().equals(memberDto.getAllowIpBasic())) {
|
| 500 | 511 |
isPermit = true; |
| 501 | 512 |
} |
... | ... | @@ -526,7 +537,7 @@ |
| 526 | 537 |
} |
| 527 | 538 |
|
| 528 | 539 |
try {
|
| 529 |
- saveSystemLog("[BIND RESULT : " + resultCode + "]");
|
|
| 540 |
+ saveSystemLog(printTaskLog() + "[BIND RESULT : " + resultCode + "]"); |
|
| 530 | 541 |
channel.write(Bind.makeBindAckBuffer(resultCode)); |
| 531 | 542 |
if ("00".equals(resultCode) == false) {
|
| 532 | 543 |
expireConnectUser(); |
... | ... | @@ -623,7 +634,7 @@ |
| 623 | 634 |
|
| 624 | 635 |
private void saveLog(Object obj, boolean isConsoleOutput) {
|
| 625 | 636 |
if (isConsoleOutput) {
|
| 626 |
- System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern(LOG_DATE_FORMAT)) + " {{COLLECT_READ_TASK}} " + obj);
|
|
| 637 |
+ System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern(LOG_DATE_FORMAT)) + " {{" + this.serviceName + "}} " + obj);
|
|
| 627 | 638 |
} |
| 628 | 639 |
|
| 629 | 640 |
if (logger == null) {
|
--- src/main/java/com/munjaon/server/server/task/ReportServerTask.java
+++ src/main/java/com/munjaon/server/server/task/ReportServerTask.java
... | ... | @@ -1,13 +1,13 @@ |
| 1 | 1 |
package com.munjaon.server.server.task; |
| 2 | 2 |
|
| 3 |
+import com.munjaon.server.cache.dto.MemberDto; |
|
| 4 |
+import com.munjaon.server.cache.enums.CacheService; |
|
| 5 |
+import com.munjaon.server.cache.service.MemberService; |
|
| 3 | 6 |
import com.munjaon.server.queue.pool.ReportQueue; |
| 4 | 7 |
import com.munjaon.server.server.config.ServerConfig; |
| 5 | 8 |
import com.munjaon.server.server.dto.ReportDto; |
| 6 | 9 |
import com.munjaon.server.server.dto.ReportUserDto; |
| 7 |
-import com.munjaon.server.server.packet.Header; |
|
| 8 |
-import com.munjaon.server.server.packet.LinkCheck; |
|
| 9 |
-import com.munjaon.server.server.packet.Packet; |
|
| 10 |
-import com.munjaon.server.server.packet.Report; |
|
| 10 |
+import com.munjaon.server.server.packet.*; |
|
| 11 | 11 |
import com.munjaon.server.server.queue.ReportUserQueue; |
| 12 | 12 |
import com.munjaon.server.server.service.PropertyLoader; |
| 13 | 13 |
import com.munjaon.server.util.LogUtil; |
... | ... | @@ -37,9 +37,13 @@ |
| 37 | 37 |
private boolean IS_SERVER_RUN; // 서버가 구동중인지 여부 |
| 38 | 38 |
private boolean IS_RUN_YN; |
| 39 | 39 |
private long RUN_FLAG_CHECK_TIME; |
| 40 |
+ private long SEND_CYCLE_CHECK_TIME; |
|
| 40 | 41 |
|
| 41 | 42 |
/* 세션이 만료되었는지 체크 */ |
| 42 | 43 |
private boolean isExpiredYn; |
| 44 |
+ /* 클라이언트 요청 데이터 수신 */ |
|
| 45 |
+ private ByteBuffer headBuffer = ByteBuffer.allocateDirect(Header.HEADER_LENGTH); |
|
| 46 |
+ private ReportDto reportDto; // 전송 리포트 |
|
| 43 | 47 |
/* Packet을 전송했는지 여부 */ |
| 44 | 48 |
private boolean isPacketSendYn; |
| 45 | 49 |
|
... | ... | @@ -74,103 +78,277 @@ |
| 74 | 78 |
return IS_SERVER_RUN && IS_RUN_YN; |
| 75 | 79 |
} |
| 76 | 80 |
|
| 81 |
+ /* 로그 헤더 생성 */ |
|
| 82 |
+ private String printTaskLog() {
|
|
| 83 |
+ StringBuilder builder = new StringBuilder(); |
|
| 84 |
+ builder.append("[ReportServerTask]");
|
|
| 85 |
+ if (reportUserDto.isLogin()) {
|
|
| 86 |
+ builder.append("[ID : ").append(reportUserDto.getUserId()).append("]");
|
|
| 87 |
+ } else {
|
|
| 88 |
+ builder.append("[FIRST CONNECTION ... ... ... ... ... ... ...]");
|
|
| 89 |
+ } |
|
| 90 |
+ |
|
| 91 |
+ return builder.toString(); |
|
| 92 |
+ } |
|
| 93 |
+ |
|
| 77 | 94 |
@Override |
| 78 | 95 |
public void run() {
|
| 79 |
- saveSystemLog("ReportServerTask is Entered");
|
|
| 96 |
+ saveSystemLog(printTaskLog() + "[### Start ### ### ### ### ### ### ###]"); |
|
| 80 | 97 |
/* 최초 RUN Flag 체크 */ |
| 81 | 98 |
reloadRunFlag(); |
| 82 |
- /* BIND 체크 및 처리 */ |
|
| 83 |
- while (isRun()) {
|
|
| 84 |
- /* 만료 여부 체크 */ |
|
| 85 |
- if (isExpiredYn) {
|
|
| 86 |
- break; |
|
| 99 |
+ try {
|
|
| 100 |
+ /* BIND 체크 및 처리 */ |
|
| 101 |
+ bindInterest(); |
|
| 102 |
+ SEND_CYCLE_CHECK_TIME = System.currentTimeMillis(); |
|
| 103 |
+ while (reportUserDto.isLogin() && isRun()) {
|
|
| 104 |
+ /* 만료 여부 체크 */ |
|
| 105 |
+ if (isExpiredYn) {
|
|
| 106 |
+ break; |
|
| 107 |
+ } |
|
| 108 |
+// saveSystemLog("ReportServerTask is Running");
|
|
| 109 |
+ try {
|
|
| 110 |
+ sendInterest(); |
|
| 111 |
+ recvInterest(); |
|
| 112 |
+ /* RUN Flag 체크 */ |
|
| 113 |
+ reloadRunFlag(); |
|
| 114 |
+ } catch (Exception e) {
|
|
| 115 |
+ this.isExpiredYn = true; |
|
| 116 |
+ e.printStackTrace(); |
|
| 117 |
+ } |
|
| 87 | 118 |
} |
| 88 |
- |
|
| 89 |
- try {
|
|
| 90 |
- sendInterest(); |
|
| 91 |
- /* RUN Flag 체크 */ |
|
| 92 |
- reloadRunFlag(); |
|
| 93 |
- } catch (Exception e) {
|
|
| 94 |
- this.isExpiredYn = true; |
|
| 95 |
- e.printStackTrace(); |
|
| 96 |
- } |
|
| 119 |
+ } catch (Exception e) {
|
|
| 120 |
+ /* 세션 만료 여부 */ |
|
| 121 |
+ this.isExpiredYn = true; |
|
| 122 |
+ e.printStackTrace(); |
|
| 97 | 123 |
} |
| 98 | 124 |
/* 중요 : 사용자 Thread 실행모드 Off */ |
| 99 | 125 |
reportUserDto.setRunningMode(false); |
| 100 |
- saveSystemLog("ReportServerTask is Finished");
|
|
| 126 |
+ saveSystemLog(printTaskLog() + "[### End ### ### ### ### ### ### ###]"); |
|
| 101 | 127 |
} |
| 102 | 128 |
|
| 103 |
-// private void recvInterest() {
|
|
| 104 |
-// while (isPacketSendYn) {
|
|
| 105 |
-// |
|
| 106 |
-// } |
|
| 107 |
-// int size = -1; |
|
| 108 |
-// try {
|
|
| 109 |
-// /* 1. Head 읽기 */ |
|
| 110 |
-// ByteBuffer headBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH); |
|
| 111 |
-// try {
|
|
| 112 |
-// size = channel.read(headBuffer); |
|
| 113 |
-// } catch (IOException e) {}
|
|
| 114 |
-// /* 2. Body 읽기 */ |
|
| 115 |
-// if (size > 0) {
|
|
| 116 |
-// String command = Header.getCommand(headBuffer); |
|
| 117 |
-// switch (Integer.parseInt(command)) {
|
|
| 118 |
-// case 1: |
|
| 119 |
-// recvBind(channel, headBuffer); |
|
| 120 |
-// break; |
|
| 121 |
-// case 3: |
|
| 122 |
-// recvDeliver(channel, headBuffer); |
|
| 123 |
-// break; |
|
| 124 |
-// case 7: |
|
| 125 |
-// recvLinkCheck(channel); |
|
| 126 |
-// break; |
|
| 127 |
-// default: |
|
| 128 |
-// expireConnectUser(); |
|
| 129 |
-// break; |
|
| 130 |
-// } |
|
| 131 |
-// } else if (size == 0) {
|
|
| 132 |
-// Thread.sleep(1); |
|
| 133 |
-// if (System.currentTimeMillis() - reportUserDto.getLastTrafficTime() > ServerConfig.REPORT_EXEC_CYCLE_TIME) {
|
|
| 134 |
-// this.isExpiredYn = true; |
|
| 135 |
-// } |
|
| 136 |
-// } else {
|
|
| 137 |
-// expireConnectUser(); |
|
| 138 |
-// } |
|
| 139 |
-// } catch (Exception e) {
|
|
| 140 |
-// size = -1; |
|
| 141 |
-// e.printStackTrace(); |
|
| 142 |
-// } |
|
| 143 |
-// } |
|
| 129 |
+ private void initHeaderBuffer() {
|
|
| 130 |
+ this.headBuffer.clear(); |
|
| 131 |
+ for (int loopCnt = 0; loopCnt < Header.HEADER_LENGTH; loopCnt++) {
|
|
| 132 |
+ this.headBuffer.put(Packet.SET_DEFAULT_BYTE); |
|
| 133 |
+ } |
|
| 134 |
+ this.headBuffer.position(0); |
|
| 135 |
+ } |
|
| 136 |
+ |
|
| 137 |
+ private int readHeader() {
|
|
| 138 |
+ initHeaderBuffer(); |
|
| 139 |
+ int size = -1; |
|
| 140 |
+ try {
|
|
| 141 |
+ size = channel.read(headBuffer); |
|
| 142 |
+ } catch (IOException e) {
|
|
| 143 |
+ throw new RuntimeException(e); |
|
| 144 |
+ } |
|
| 145 |
+ |
|
| 146 |
+ return size; |
|
| 147 |
+ } |
|
| 148 |
+ |
|
| 149 |
+ private void bindInterest() throws IOException {
|
|
| 150 |
+// if (reportUserDto.isLogin() && !isRun()) {
|
|
| 151 |
+ if (reportUserDto.isLogin()) {
|
|
| 152 |
+ return; |
|
| 153 |
+ } |
|
| 154 |
+ long bind_check_start_time = System.currentTimeMillis(); |
|
| 155 |
+ while(true) {
|
|
| 156 |
+ /* 1. Head 읽기 */ |
|
| 157 |
+ int size = readHeader(); |
|
| 158 |
+ /* 2. Body 읽기 */ |
|
| 159 |
+ if (size > 0) {
|
|
| 160 |
+ String command = Header.getCommand(this.headBuffer); |
|
| 161 |
+ switch (Integer.parseInt(command)) {
|
|
| 162 |
+ case 1 : recvBind(channel, headBuffer); break; |
|
| 163 |
+ default: expireConnectUser(); break; |
|
| 164 |
+ } |
|
| 165 |
+ /* 패킷 수신한 경우 무조건 루프를 빠져나간다 */ |
|
| 166 |
+ break; |
|
| 167 |
+ } |
|
| 168 |
+ /* 3초 이내에 로그인 실패시 종료 */ |
|
| 169 |
+ if (System.currentTimeMillis() - bind_check_start_time > ServerConfig.LIMIT_BIND_TIMEOUT) {
|
|
| 170 |
+ expireConnectUser(); |
|
| 171 |
+ break; |
|
| 172 |
+ } |
|
| 173 |
+ } |
|
| 174 |
+ } |
|
| 175 |
+ |
|
| 176 |
+ private void recvBind(SocketChannel channel, ByteBuffer headBuffer) {
|
|
| 177 |
+ String resultCode = "00"; |
|
| 178 |
+ try {
|
|
| 179 |
+ ByteBuffer bindBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + Bind.BIND_BODY_LENGTH); |
|
| 180 |
+ ByteBuffer bodyBuffer = ByteBuffer.allocate(Bind.BIND_BODY_LENGTH); |
|
| 181 |
+ channel.read(bodyBuffer); |
|
| 182 |
+ Packet.mergeBuffers(bindBuffer, headBuffer, bodyBuffer); |
|
| 183 |
+ |
|
| 184 |
+ String id = Bind.getBindId(bindBuffer); |
|
| 185 |
+ String pwd = Bind.getBindPwd(bindBuffer); |
|
| 186 |
+ |
|
| 187 |
+ MemberService svc = (MemberService) CacheService.LOGIN_SERVICE.getService(); |
|
| 188 |
+ MemberDto memberDto = null; |
|
| 189 |
+ if (svc != null) {
|
|
| 190 |
+ memberDto = svc.get(id); |
|
| 191 |
+ } |
|
| 192 |
+ saveSystemLog(printTaskLog() + "[BIND REQUEST] [ID : " + id + ", PWD : " + pwd + "]"); |
|
| 193 |
+ /* Bind Check */ |
|
| 194 |
+ resultCode = checkBind(memberDto, id, pwd); |
|
| 195 |
+ |
|
| 196 |
+ /* 접속 IP 체크 */ |
|
| 197 |
+ if ("00".equals(resultCode)) {
|
|
| 198 |
+ boolean isPermit = false; |
|
| 199 |
+ if (memberDto.getIpLimitYn() == null || "Y".equals(memberDto.getIpLimitYn())) {
|
|
| 200 |
+ saveSystemLog(printTaskLog() + "[REMOTE IP : " + reportUserDto.getRemoteIP() + "]"); |
|
| 201 |
+ saveSystemLog(printTaskLog() + "[ALLOW IP BASIC : " + memberDto.getAllowIpBasic() + "]"); |
|
| 202 |
+ saveSystemLog(printTaskLog() + "[ALLOW IP EXTEND : " + memberDto.getAllowIpExtend() + "]"); |
|
| 203 |
+ if (memberDto.getAllowIpBasic() != null && reportUserDto.getRemoteIP().equals(memberDto.getAllowIpBasic())) {
|
|
| 204 |
+ isPermit = true; |
|
| 205 |
+ } |
|
| 206 |
+ if (memberDto.getAllowIpExtend() != null && reportUserDto.getRemoteIP().equals(memberDto.getAllowIpExtend())) {
|
|
| 207 |
+ isPermit = true; |
|
| 208 |
+ } |
|
| 209 |
+ } else {
|
|
| 210 |
+ isPermit = true; |
|
| 211 |
+ } |
|
| 212 |
+ if (isPermit) {
|
|
| 213 |
+ resultCode = "00"; |
|
| 214 |
+ } else {
|
|
| 215 |
+ resultCode = "40"; |
|
| 216 |
+ } |
|
| 217 |
+ } |
|
| 218 |
+ |
|
| 219 |
+ if ("00".equals(resultCode)) {
|
|
| 220 |
+ reportUserDto.setUserId(id); |
|
| 221 |
+ reportUserDto.setLogin(true); |
|
| 222 |
+ reportUserDto.setMemberDto(memberDto); |
|
| 223 |
+ /* 리포트 큐 생성 */ |
|
| 224 |
+ ReportQueue reportQueue = new ReportQueue(reportUserDto.getQueuePath(), reportUserDto.getUserId()); |
|
| 225 |
+ reportUserDto.setReportQueue(reportQueue); |
|
| 226 |
+ /* 사용자 Pool에 저장 */ |
|
| 227 |
+ reportUserQueue.putUser(reportUserDto); |
|
| 228 |
+ /* 세션통신 시간 업데이트 */ |
|
| 229 |
+ reportUserDto.updateLastTrafficTime(); |
|
| 230 |
+ } |
|
| 231 |
+ } catch (Exception e) {
|
|
| 232 |
+ resultCode = "10"; |
|
| 233 |
+ e.printStackTrace(); |
|
| 234 |
+ } |
|
| 235 |
+ |
|
| 236 |
+ try {
|
|
| 237 |
+ saveSystemLog(printTaskLog() + "[BIND RESULT : " + resultCode + "]"); |
|
| 238 |
+ channel.write(Bind.makeBindAckBuffer(resultCode)); |
|
| 239 |
+ if ("00".equals(resultCode) == false) {
|
|
| 240 |
+ expireConnectUser(); |
|
| 241 |
+ } |
|
| 242 |
+ } catch (IOException e) {
|
|
| 243 |
+ e.printStackTrace(); |
|
| 244 |
+ } |
|
| 245 |
+ } |
|
| 246 |
+ |
|
| 247 |
+ private String checkBind(MemberDto memberDto, String id, String pwd) {
|
|
| 248 |
+ if (id == null || pwd == null) {
|
|
| 249 |
+ return "50"; |
|
| 250 |
+ } |
|
| 251 |
+ if (reportUserQueue.isExist(id)) {
|
|
| 252 |
+ return "60"; |
|
| 253 |
+ } |
|
| 254 |
+ if (memberDto == null || !pwd.equals(memberDto.getAccessKey())) {
|
|
| 255 |
+ return "20"; |
|
| 256 |
+ } |
|
| 257 |
+ /* 회원 사용 상태 */ |
|
| 258 |
+ if (memberDto.getMberSttus() == null || "N".equals(memberDto.getMberSttus())) {
|
|
| 259 |
+ return "30"; |
|
| 260 |
+ } |
|
| 261 |
+ |
|
| 262 |
+ return "00"; |
|
| 263 |
+ } |
|
| 264 |
+ |
|
| 265 |
+ private void recvInterest() throws IOException, InterruptedException, Exception {
|
|
| 266 |
+ while (isPacketSendYn) {
|
|
| 267 |
+ /* 1. Head 읽기 */ |
|
| 268 |
+ ByteBuffer headBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH); |
|
| 269 |
+ int size = channel.read(headBuffer); |
|
| 270 |
+ if (size > 0) {
|
|
| 271 |
+ String command = Header.getCommand(headBuffer); |
|
| 272 |
+ switch (Integer.parseInt(command)) {
|
|
| 273 |
+ case 6 : recvReport(channel, headBuffer); break; |
|
| 274 |
+ case 8 : recvLinkCheck(channel, headBuffer); break; |
|
| 275 |
+ default: saveSystemLog(printTaskLog() + "[INVALID REQUEST][command : " + command + ";"); |
|
| 276 |
+ expireConnectUser(); break; |
|
| 277 |
+ } |
|
| 278 |
+ } else if (size == 0) {
|
|
| 279 |
+ Thread.sleep(1); |
|
| 280 |
+ if (System.currentTimeMillis() - reportUserDto.getLastTrafficTime() > ServerConfig.REPORT_EXEC_CYCLE_TIME) {
|
|
| 281 |
+ this.isExpiredYn = true; |
|
| 282 |
+ break; |
|
| 283 |
+ } |
|
| 284 |
+ } else {
|
|
| 285 |
+ saveSystemLog(printTaskLog() + "[recvInterest : size is zero]"); |
|
| 286 |
+ expireConnectUser(); |
|
| 287 |
+ throw new IOException("[recvInterest : size is zero]");
|
|
| 288 |
+ } |
|
| 289 |
+ } |
|
| 290 |
+ } |
|
| 291 |
+ |
|
| 292 |
+ private void recvLinkCheck(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
|
|
| 293 |
+ ByteBuffer bodyBuffer = ByteBuffer.allocate(LinkCheck.LINK_CHECK_ACK_BODY_LENGTH); |
|
| 294 |
+ int size = channel.read(bodyBuffer); |
|
| 295 |
+ if (size > 0) {
|
|
| 296 |
+ saveSystemLog(printTaskLog() + "[RECEIVER LINK CHECK ACK ... ... ... ... ... ... ...]"); |
|
| 297 |
+ reportUserDto.updateLastTrafficTime(); |
|
| 298 |
+ this.isPacketSendYn = false; |
|
| 299 |
+ } |
|
| 300 |
+ } |
|
| 301 |
+ |
|
| 302 |
+ private void recvReport(SocketChannel channel, ByteBuffer headBuffer) throws Exception {
|
|
| 303 |
+ ByteBuffer bodyBuffer = ByteBuffer.allocate(Report.REPORT_ACK_BODY_LENGTH); |
|
| 304 |
+ int size = channel.read(bodyBuffer); |
|
| 305 |
+ if (size != Report.REPORT_ACK_BODY_LENGTH) {
|
|
| 306 |
+ return; |
|
| 307 |
+ } |
|
| 308 |
+ |
|
| 309 |
+ saveSystemLog(printTaskLog() + "[RECEIVE REPORT ACK ... ... ... ... ... ... ...]"); |
|
| 310 |
+ ReportQueue reportQueue = reportUserDto.getReportQueue(); |
|
| 311 |
+ reportUserDto.updateLastTrafficTime(); |
|
| 312 |
+ this.isPacketSendYn = false; |
|
| 313 |
+ if (reportQueue != null && this.reportDto != null) {
|
|
| 314 |
+ saveSystemLog(printTaskLog() + "[RECEIVE REPORT : " + this.reportDto.toString() + "]"); |
|
| 315 |
+ reportQueue.addReadCounter(); |
|
| 316 |
+ } |
|
| 317 |
+ } |
|
| 144 | 318 |
|
| 145 | 319 |
private void sendInterest() throws IOException {
|
| 146 | 320 |
if (reportUserDto.isLogin() == false) {
|
| 147 | 321 |
return; |
| 148 | 322 |
} |
| 149 |
- if (reportUserDto.isAlive() == 1) {
|
|
| 150 |
- expireConnectUser(); |
|
| 151 |
- } else if (reportUserDto.isAlive() == 2) {
|
|
| 323 |
+ if (reportUserDto.isAlive() == 2) {
|
|
| 152 | 324 |
channel.write(LinkCheck.makeLinkCheckBuffer()); |
| 325 |
+ SEND_CYCLE_CHECK_TIME = System.currentTimeMillis(); |
|
| 153 | 326 |
/* Packet을 전송했는지 여부 */ |
| 154 | 327 |
isPacketSendYn = true; |
| 155 | 328 |
} else {
|
| 156 | 329 |
if (this.reportQueue != null && this.reportQueue.isRemainReport()) {
|
| 157 | 330 |
try {
|
| 158 |
- ReportDto reportDto = this.reportQueue.popReportFromQueue(); |
|
| 331 |
+ this.reportDto = this.reportQueue.popReportFromQueue(); |
|
| 159 | 332 |
if (reportDto == null) {
|
| 160 | 333 |
return; |
| 161 | 334 |
} |
| 162 |
- saveSystemLog("[REPORT : " + reportDto.toString() + "]");
|
|
| 335 |
+ saveSystemLog(printTaskLog() + "[REPORT SEND : " + reportDto.toString() + "]"); |
|
| 163 | 336 |
ByteBuffer reportBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + Report.REPORT_BODY_LENGTH); |
| 164 | 337 |
Packet.setDefaultByte(reportBuffer); |
| 165 | 338 |
Header.putHeader(reportBuffer, Header.COMMAND_REPORT, Report.REPORT_BODY_LENGTH); |
| 166 | 339 |
Report.putReport(reportBuffer, reportDto); |
| 167 | 340 |
channel.write(reportBuffer); |
| 168 | 341 |
/* Packet을 전송했는지 여부 */ |
| 342 |
+ SEND_CYCLE_CHECK_TIME = System.currentTimeMillis(); |
|
| 169 | 343 |
isPacketSendYn = true; |
| 170 | 344 |
} catch (Exception e) {
|
| 171 | 345 |
e.printStackTrace(); |
| 172 | 346 |
} |
| 173 | 347 |
} |
| 348 |
+ } |
|
| 349 |
+ /* 쓰레드 완료 시점 체크 */ |
|
| 350 |
+ if (System.currentTimeMillis() - SEND_CYCLE_CHECK_TIME > ServerConfig.REPORT_EXEC_CYCLE_TIME) {
|
|
| 351 |
+ this.isExpiredYn = true; |
|
| 174 | 352 |
} |
| 175 | 353 |
} |
| 176 | 354 |
|
... | ... | @@ -180,6 +358,7 @@ |
| 180 | 358 |
} |
| 181 | 359 |
try {
|
| 182 | 360 |
SocketChannel channel = (SocketChannel) key.channel(); |
| 361 |
+ saveSystemLog("[ReportServerTask]Expire connect user: " + reportUserDto);
|
|
| 183 | 362 |
if (reportUserDto != null) {
|
| 184 | 363 |
if (reportUserDto.getUserId() != null) {
|
| 185 | 364 |
reportUserQueue.removeUser(reportUserDto.getUserId()); |
... | ... | @@ -207,7 +386,7 @@ |
| 207 | 386 |
|
| 208 | 387 |
private void saveLog(Object obj, boolean isConsoleOutput) {
|
| 209 | 388 |
if (isConsoleOutput) {
|
| 210 |
- System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern(LOG_DATE_FORMAT)) + " {{COLLECT_READ_TASK}} " + obj);
|
|
| 389 |
+ System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern(LOG_DATE_FORMAT)) + " {{" + this.serviceName + "}} " + obj);
|
|
| 211 | 390 |
} |
| 212 | 391 |
|
| 213 | 392 |
if (logger == null) {
|
--- src/main/resources/sqlmap/sample_sql.xml
... | ... | @@ -1,8 +0,0 @@ |
| 1 | -<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |
| 3 | -<mapper namespace="com.munjaon.server.api.mapper.SampleMapper"> | |
| 4 | - <select id="get" resultType="int"> | |
| 5 | - /* SampleMapper.get */ | |
| 6 | - SELECT 1 | |
| 7 | - </select> | |
| 8 | -</mapper>(No newline at end of file) |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?