Compare commits
4 Commits
6583a45abd
...
feat/train
| Author | SHA1 | Date | |
|---|---|---|---|
| 265813e6f7 | |||
| 8190a6e9c8 | |||
| e9f8bb37fa | |||
| f3c822587f |
@@ -3,7 +3,6 @@ package com.kamco.cd.training.common.utils;
|
|||||||
import static java.lang.String.CASE_INSENSITIVE_ORDER;
|
import static java.lang.String.CASE_INSENSITIVE_ORDER;
|
||||||
|
|
||||||
import com.jcraft.jsch.ChannelExec;
|
import com.jcraft.jsch.ChannelExec;
|
||||||
import com.jcraft.jsch.ChannelSftp;
|
|
||||||
import com.jcraft.jsch.JSch;
|
import com.jcraft.jsch.JSch;
|
||||||
import com.jcraft.jsch.Session;
|
import com.jcraft.jsch.Session;
|
||||||
import com.kamco.cd.training.common.exception.CustomApiException;
|
import com.kamco.cd.training.common.exception.CustomApiException;
|
||||||
@@ -720,18 +719,26 @@ public class FIleChecker {
|
|||||||
public static void unzip(String fileName, String destDirectory) throws IOException {
|
public static void unzip(String fileName, String destDirectory) throws IOException {
|
||||||
String zipFilePath = destDirectory + File.separator + fileName;
|
String zipFilePath = destDirectory + File.separator + fileName;
|
||||||
|
|
||||||
|
log.info("fileName : {}", fileName);
|
||||||
|
log.info("destDirectory : {}", destDirectory);
|
||||||
|
log.info("zipFilePath : {}", zipFilePath);
|
||||||
// zip 이름으로 폴더 생성 (확장자 제거)
|
// zip 이름으로 폴더 생성 (확장자 제거)
|
||||||
String folderName =
|
String folderName =
|
||||||
fileName.endsWith(".zip") ? fileName.substring(0, fileName.length() - 4) : fileName;
|
fileName.endsWith(".zip") ? fileName.substring(0, fileName.length() - 4) : fileName;
|
||||||
|
log.info("folderName : {}", folderName);
|
||||||
|
|
||||||
File destDir = new File(destDirectory, folderName);
|
File destDir = new File(destDirectory, folderName);
|
||||||
|
log.info("destDir : {}", destDir);
|
||||||
|
|
||||||
// 동일 폴더가 이미 있으면 삭제
|
// 동일 폴더가 이미 있으면 삭제
|
||||||
|
log.info("111 destDir.exists() : {}", destDir.exists());
|
||||||
if (destDir.exists()) {
|
if (destDir.exists()) {
|
||||||
deleteDirectoryRecursively(destDir.toPath());
|
deleteDirectoryRecursively(destDir.toPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("222 destDir.exists() : {}", destDir.exists());
|
||||||
if (!destDir.exists()) {
|
if (!destDir.exists()) {
|
||||||
|
log.info("mkdirs : {}", destDir.exists());
|
||||||
destDir.mkdirs();
|
destDir.mkdirs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -787,92 +794,6 @@ public class FIleChecker {
|
|||||||
return destFile;
|
return destFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void uploadTo86(Path localFile) {
|
|
||||||
|
|
||||||
String host = "192.168.2.86";
|
|
||||||
int port = 22;
|
|
||||||
String username = "kcomu";
|
|
||||||
String password = "Kamco2025!";
|
|
||||||
|
|
||||||
String remoteDir = "/home/kcomu/data/request";
|
|
||||||
|
|
||||||
Session session = null;
|
|
||||||
ChannelSftp channel = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSch jsch = new JSch();
|
|
||||||
|
|
||||||
session = jsch.getSession(username, host, port);
|
|
||||||
session.setPassword(password);
|
|
||||||
|
|
||||||
Properties config = new Properties();
|
|
||||||
config.put("StrictHostKeyChecking", "no");
|
|
||||||
session.setConfig(config);
|
|
||||||
|
|
||||||
session.connect(10_000);
|
|
||||||
|
|
||||||
channel = (ChannelSftp) session.openChannel("sftp");
|
|
||||||
channel.connect(10_000);
|
|
||||||
|
|
||||||
// 목적지 디렉토리 이동
|
|
||||||
channel.cd(remoteDir);
|
|
||||||
|
|
||||||
// 업로드
|
|
||||||
channel.put(localFile.toString(), localFile.getFileName().toString());
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException("SFTP upload failed", e);
|
|
||||||
} finally {
|
|
||||||
if (channel != null) channel.disconnect();
|
|
||||||
if (session != null) session.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void unzipOn86Server(String zipPath, String targetDir) {
|
|
||||||
|
|
||||||
String host = "192.168.2.86";
|
|
||||||
String user = "kcomu";
|
|
||||||
String password = "Kamco2025!";
|
|
||||||
|
|
||||||
Session session = null;
|
|
||||||
ChannelExec channel = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSch jsch = new JSch();
|
|
||||||
|
|
||||||
session = jsch.getSession(user, host, 22);
|
|
||||||
session.setPassword(password);
|
|
||||||
|
|
||||||
Properties config = new Properties();
|
|
||||||
config.put("StrictHostKeyChecking", "no");
|
|
||||||
session.setConfig(config);
|
|
||||||
|
|
||||||
session.connect(10_000);
|
|
||||||
|
|
||||||
String command = "unzip -o " + zipPath + " -d " + targetDir;
|
|
||||||
|
|
||||||
channel = (ChannelExec) session.openChannel("exec");
|
|
||||||
channel.setCommand(command);
|
|
||||||
channel.setErrStream(System.err);
|
|
||||||
|
|
||||||
InputStream in = channel.getInputStream();
|
|
||||||
channel.connect();
|
|
||||||
|
|
||||||
// 출력 읽기(선택)
|
|
||||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
|
|
||||||
while (br.readLine() != null) {
|
|
||||||
// 필요하면 로그
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} finally {
|
|
||||||
if (channel != null) channel.disconnect();
|
|
||||||
if (session != null) session.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<String> execCommandAndReadLines(String command) {
|
public static List<String> execCommandAndReadLines(String command) {
|
||||||
|
|
||||||
List<String> result = new ArrayList<>();
|
List<String> result = new ArrayList<>();
|
||||||
|
|||||||
@@ -20,9 +20,7 @@ import java.util.stream.Stream;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.context.event.EventListener;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@@ -58,7 +56,7 @@ public class JobRecoveryOnStartupService {
|
|||||||
* <p>@Transactional: - recover() 메서드 전체가 하나의 트랜잭션으로 감싸집니다. - Job 하나씩 처리하다가 예외가 발생하면 전체 롤백이 될 수
|
* <p>@Transactional: - recover() 메서드 전체가 하나의 트랜잭션으로 감싸집니다. - Job 하나씩 처리하다가 예외가 발생하면 전체 롤백이 될 수
|
||||||
* 있으므로 "잡 단위로 확실히 커밋"이 필요하면 (권장) 잡 단위로 분리 트랜잭션(REQUIRES_NEW) 고려하세요.
|
* 있으므로 "잡 단위로 확실히 커밋"이 필요하면 (권장) 잡 단위로 분리 트랜잭션(REQUIRES_NEW) 고려하세요.
|
||||||
*/
|
*/
|
||||||
// @EventListener(ApplicationReadyEvent.class)
|
// @EventListener(ApplicationReadyEvent.class)
|
||||||
@Transactional
|
@Transactional
|
||||||
public void recover() {
|
public void recover() {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user