장동신 장동신 2024-11-12
MMS, 카카오 알림톡, 친구톡 파일처리 로직 수정
@a1f4496a8327f3fcfb63a1ec9a64dbaa60491db0
src/main/java/com/munjaon/server/server/task/CollectServerTask.java
--- src/main/java/com/munjaon/server/server/task/CollectServerTask.java
+++ src/main/java/com/munjaon/server/server/task/CollectServerTask.java
@@ -182,7 +182,7 @@
         return false;
     }
 
-    private void recvDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+    private void recvDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception {
         /* 서비스 중지여부 체크 */
         if (isExpireService()) {
             expireConnectUser();
@@ -254,7 +254,7 @@
         return messageDto;
     }
 
-    private void recvSmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+    private void recvSmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception {
         try {
             ByteBuffer bodyBuffer = ByteBuffer.allocate(SmsMessage.DELIVER_SMS_BODY_LENGTH);
             channel.read(bodyBuffer);
@@ -283,11 +283,12 @@
                 connectUserDto.updateLastTrafficTime();
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            saveLog(e);
+            throw e;
         }
     }
 
-    private void recvLmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+    private void recvLmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception {
         try {
             ByteBuffer bodyBuffer = ByteBuffer.allocate(LmsMessage.DELIVER_LMS_BODY_LENGTH);
             channel.read(bodyBuffer);
@@ -316,11 +317,12 @@
                 connectUserDto.updateLastTrafficTime();
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            saveLog(e);
+            throw e;
         }
     }
 
-    private void recvMmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+    private void recvMmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception {
         try {
             long MSG_RECV_TIME = System.currentTimeMillis();    // 메시지를 수신한 시간
             ByteBuffer bodyBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_BODY_LENGTH);
@@ -370,7 +372,7 @@
                 long IMAGE_RECV_TIME = System.currentTimeMillis();    // 이미지 패킷 처리 시작시간
                 while (true) {
                     int bufferSize = 1024;
-                    if (recvFileSize < fileSize) {
+                    if ((fileSize - recvFileSize) < 1024) {
                         bufferSize = fileSize - recvFileSize;
                     }
 
@@ -384,15 +386,15 @@
                     }
 
                     if (recvFileSize == fileSize) {
-                        if (saveFileCount == 0) {
+                        saveFileCount = saveFileCount + 1;    // 수신한 파일 카운트 증가
+                        if (saveFileCount == 1) {
                             messageDto.setUserFileName01(imagePath + File.separator + fileName);
-                        } else if (saveFileCount == 1) {
-                            messageDto.setUserFileName02(imagePath + File.separator + fileName);
                         } else if (saveFileCount == 2) {
+                            messageDto.setUserFileName02(imagePath + File.separator + fileName);
+                        } else if (saveFileCount == 3) {
                             messageDto.setUserFileName03(imagePath + File.separator + fileName);
                         }
                         JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
-                        saveFileCount++;    // 수신한 파일 카운트 증가
                         break;
                     }
 
@@ -402,40 +404,14 @@
                         break;
                     }
                 }
-//                ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
-//                channel.read(fileBuffer);
-//                saveSystemLog("fileBuffer Last : " + fileBuffer.get(fileBuffer.capacity() - 1));
-//                fileBuffer.flip();
-//                JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
-//                if (saveFileCount == 0) {
-//                    messageDto.setUserFileName01(imagePath + File.separator + fileName);
-//                } else if (saveFileCount == 1) {
-//                    messageDto.setUserFileName02(imagePath + File.separator + fileName);
-//                } else if (saveFileCount == 2) {
-//                    messageDto.setUserFileName03(imagePath + File.separator + fileName);
-//                }
-//                saveLog(printTaskLog() + "[MMS IMAGE] [File : " + fileName + ", Size : " + fileSize + "]");
-//                saveFileCount++;    // 수신한 파일 카운트 증가
             }
 
-//            for (int i = 0; i < recvFileCount; i++) {
-//                ByteBuffer fileHeadBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_FILENAME_LENGTH + MmsMessage.DELIVER_MMS_FILESIZE_LENGTH);
-//                channel.read(fileHeadBuffer);
-//                String fileName = MmsMessage.getFileNameForDeliver(fileHeadBuffer);
-//                String fileSize = MmsMessage.getFileSizeForDeliver(fileHeadBuffer);
-//                ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
-//                channel.read(fileBuffer);
-//                fileBuffer.flip();
-//                JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
-//                if (i == 0) {
-//                    messageDto.setUserFileName01(imagePath + File.separator + fileName);
-//                } else if (i == 1) {
-//                    messageDto.setUserFileName02(imagePath + File.separator + fileName);
-//                } else if (i == 2) {
-//                    messageDto.setUserFileName03(imagePath + File.separator + fileName);
-//                }
-//                saveLog(printTaskLog() + "[MMS IMAGE] [File : " + fileName + ", Size : " + fileSize + "]");
-//            }
+            /* 이미지를 모두 수신하지 못한 경우 */
+            if (recvFileCount == 0 || (recvFileCount != saveFileCount)) {
+                saveLog(printTaskLog() + "[MMS File Count : " + recvFileCount + " | saveFileCount : " + saveFileCount + "]");
+                expireConnectUser();
+                return;
+            }
 
             /* 사용자 단가, 발송망 설정 */
             MemberDto savedMemberDto = null;
@@ -463,11 +439,94 @@
                 connectUserDto.updateLastTrafficTime();
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            saveLog(e);
+            throw e;
         }
     }
 
-    private void recvKatDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+    private void recvKatDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception {
+        try {
+            ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            channel.read(bodyBuffer);
+            ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            Packet.mergeBuffers(deliverBuffer, headBuffer, bodyBuffer);
+
+            BasicMessageDto messageDto = recvCommonMessage(deliverBuffer);
+            messageDto.setUserSubject(KakaoMessage.getSubjectForDeliver(deliverBuffer));
+            messageDto.setUserMessage(KakaoMessage.getMessageForDeliver(deliverBuffer));
+            messageDto.setKakaoSenderKey(KakaoMessage.getKakaoSenderKeyForDeliver(deliverBuffer));
+            messageDto.setKakaoTemplateCode(KakaoMessage.getKakaoTemplateCodeForDeliver(deliverBuffer));
+
+            String jsonPath = System.getProperty("ROOTPATH") + File.separator + "kakaofile";
+            jsonPath = jsonPath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo();
+            FileUtil.mkdirs(jsonPath);
+
+            ByteBuffer fileHeadBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_JSON_FILENAME_LENGTH + KakaoMessage.DELIVER_JSON_FILESIZE_LENGTH);
+            channel.read(fileHeadBuffer);
+
+            String fileName = KakaoMessage.getFileNameForDeliver(fileHeadBuffer);
+            int fileSize = Integer.parseInt(KakaoMessage.getFileSizeForDeliver(fileHeadBuffer));
+
+            ByteBuffer fileBuffer = ByteBuffer.allocate(fileSize);
+            /* 파일 수신 */
+            int recvFileSize = 0;
+            long IMAGE_RECV_TIME = System.currentTimeMillis();    // 파일 패킷 처리 시작시간
+            while (true) {
+                int bufferSize = 1024;
+                if ((fileSize - recvFileSize) < 1024) {
+                    bufferSize = fileSize - recvFileSize;
+                }
+
+                ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
+                int unitRecvCnt = channel.read(buffer);
+                if (unitRecvCnt > 0) {
+                    Packet.mergeBuffers(fileBuffer, buffer, recvFileSize);
+                    recvFileSize += unitRecvCnt;
+                    saveLog("unitRecvCnt : " + unitRecvCnt);
+                    saveLog("recvFileSize : " + recvFileSize);
+                }
+
+                if (recvFileSize == fileSize) {
+                    JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer);
+                    messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName);
+                    saveLog(printTaskLog() + "[KAT JSON] [File : " + fileName + ", Size : " + fileSize + "]");
+                    break;
+                }
+
+                if (System.currentTimeMillis() - IMAGE_RECV_TIME > 3000) {
+                    /* MMS 이미지 파일 수신 timeout */
+                    saveLog(printTaskLog() + "[KAKAO File : " + fileName + " : Expired ... ... ... ... ... ... ...]");
+                    expireConnectUser();
+                    return;
+                }
+            }
+
+            /* 사용자 단가, 발송망 설정 */
+            MemberDto savedMemberDto = null;
+            if (this.connectUserDto != null) {
+                savedMemberDto = this.connectUserDto.getMemberDto();
+            }
+            if (savedMemberDto != null) {
+                messageDto.setRouterSeq(savedMemberDto.getKakaoAtAgentCode());
+                messageDto.setUnitCost(String.valueOf(savedMemberDto.getKakaoAtPrice()));
+            }
+
+            saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]");
+            QueueTypeWorker worker = QueueTypeWorker.find("KAT");
+            if (worker != null) {
+                worker.pushQueue(messageDto);
+                channel.write(KakaoMessage.makeDeliverAckBuffer(messageDto.getUserMsgID(), messageDto.getSendStatus()));
+                connectUserDto.updateLastTrafficTime();
+            } else {
+                saveSystemLog("worker is null");
+            }
+        } catch (Exception e) {
+            saveLog(e);
+            throw e;
+        }
+    }
+
+    private void recvKatDeliver_bak(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
         try {
             ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
             channel.read(bodyBuffer);
@@ -522,7 +581,87 @@
         }
     }
 
-    private void recvKftDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+    private void recvKftDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception {
+        try {
+            ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            channel.read(bodyBuffer);
+            ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            Packet.mergeBuffers(deliverBuffer, headBuffer, bodyBuffer);
+
+            BasicMessageDto messageDto = recvCommonMessage(deliverBuffer);
+            messageDto.setUserSubject(KakaoMessage.getSubjectForDeliver(deliverBuffer));
+            messageDto.setUserMessage(KakaoMessage.getMessageForDeliver(deliverBuffer));
+            messageDto.setKakaoSenderKey(KakaoMessage.getKakaoSenderKeyForDeliver(deliverBuffer));
+            messageDto.setKakaoTemplateCode(KakaoMessage.getKakaoTemplateCodeForDeliver(deliverBuffer));
+
+            String jsonPath = System.getProperty("ROOTPATH") + File.separator + "kakaofile";
+            jsonPath = jsonPath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo();
+            FileUtil.mkdirs(jsonPath);
+
+            ByteBuffer fileHeadBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_JSON_FILENAME_LENGTH + KakaoMessage.DELIVER_JSON_FILESIZE_LENGTH);
+            channel.read(fileHeadBuffer);
+
+            String fileName = KakaoMessage.getFileNameForDeliver(fileHeadBuffer);
+            int fileSize = Integer.parseInt(KakaoMessage.getFileSizeForDeliver(fileHeadBuffer));
+
+            ByteBuffer fileBuffer = ByteBuffer.allocate(fileSize);
+            /* 파일 수신 */
+            int recvFileSize = 0;
+            long IMAGE_RECV_TIME = System.currentTimeMillis();    // 파일 패킷 처리 시작시간
+            while (true) {
+                int bufferSize = 1024;
+                if ((fileSize - recvFileSize) < 1024) {
+                    bufferSize = fileSize - recvFileSize;
+                }
+
+                ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
+                int unitRecvCnt = channel.read(buffer);
+                if (unitRecvCnt > 0) {
+                    Packet.mergeBuffers(fileBuffer, buffer, recvFileSize);
+                    recvFileSize += unitRecvCnt;
+                    saveLog("unitRecvCnt : " + unitRecvCnt);
+                    saveLog("recvFileSize : " + recvFileSize);
+                }
+
+                if (recvFileSize == fileSize) {
+                    JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer);
+                    messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName);
+                    saveLog(printTaskLog() + "[KAT JSON] [File : " + fileName + ", Size : " + fileSize + "]");
+                    break;
+                }
+
+                if (System.currentTimeMillis() - IMAGE_RECV_TIME > 3000) {
+                    /* MMS 이미지 파일 수신 timeout */
+                    saveLog(printTaskLog() + "[KAKAO File : " + fileName + " : Expired ... ... ... ... ... ... ...]");
+                    expireConnectUser();
+                    return;
+                }
+            }
+
+            /* 사용자 단가, 발송망 설정 */
+            MemberDto savedMemberDto = null;
+            if (this.connectUserDto != null) {
+                savedMemberDto = this.connectUserDto.getMemberDto();
+            }
+            if (savedMemberDto != null) {
+                messageDto.setRouterSeq(savedMemberDto.getKakaoFtAgentCode());
+                messageDto.setUnitCost(String.valueOf(savedMemberDto.getKakaoFtPrice()));
+            }
+
+            saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]");
+            QueueTypeWorker worker = QueueTypeWorker.find("KFT");
+            if (worker != null) {
+                worker.pushQueue(messageDto);
+                channel.write(KakaoMessage.makeDeliverAckBuffer(messageDto.getUserMsgID(), messageDto.getSendStatus()));
+                connectUserDto.updateLastTrafficTime();
+            }
+        } catch (Exception e) {
+            saveLog(e);
+            throw e;
+        }
+    }
+
+    private void recvKftDeliver_bak(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
         try {
             ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
             channel.read(bodyBuffer);
Add a comment
List