property 설정

This commit is contained in:
Rinjae
2025-11-10 16:50:37 +09:00
parent 9165e8f495
commit 797529c774
4 changed files with 122 additions and 0 deletions
@@ -9,49 +9,64 @@ import javax.validation.constraints.Pattern;
@Data
public class KjbProperty {
@KjbPropertyValue(key = "kjb.eai.batch.url")
@Pattern(regexp = "^(https?://[^\\s/$.?#][^\\s]*)|\\s*$", message = "kjb.eai_batch.url 는 유효한 URL 형식이거나 공백이어야 합니다. 예: http://example.com/api")
private String eaiBatchUrl;
@KjbPropertyValue(key = "kjb.eai.batch.connection_timeout", defaultValue = "5")
@Min(1) @Max(10)
private int eaiBatchConnectionTimeout = 5;
@KjbPropertyValue(key = "kjb.eai.batch.response_timeout", defaultValue = "5")
@Min(1) @Max(30)
private int eaiBatchResponseTimeout = 5;
@KjbPropertyValue(key = "kjb.eai.batch.timeout", defaultValue = "10")
@Min(1) @Max(30)
private int eaiBatchTimeout = 10;
@KjbPropertyValue(key = "kjb.eai.batch.charset", defaultValue = "euc-kr")
@NotEmpty
private String eaiBatchCharset = "euc-kr";
@KjbPropertyValue(key = "kjb.ums.eai_batch.send_dir")
@NotEmpty(message = "kjb.ums.eai_batch.send_dir 는 필수값입니다.")
private String umsEaiBatchSendDir;
@KjbPropertyValue(key = "kjb.ums.eai_batch.backup_dir")
@NotEmpty(message = "kjb.ums.eai_batch.backup_dir 는 필수값입니다.")
private String umsEaiBatchBackupDir;
@KjbPropertyValue(key = "kjb.ums.eai_batch.error_dir")
@NotEmpty(message = "kjb.ums.eai_batch.error_dir 는 필수값입니다.")
private String umsEaiBatchErrorDir;
@KjbPropertyValue(key = "kjb.ums.eai_batch.interface_id")
@Pattern(regexp = "^[a-zA-Z0-9]{13}$", message = "kjb.ums.eai_batch.interface_id 는 12자리 영문대소문자 및 숫자 조합이어야 합니다.")
private String umsEaiBatchInterfaceId;
@KjbPropertyValue(key = "kjb.ums.eai_batch.retention_date", defaultValue = "60")
@Min(1) @Max(365)
private int umsEaiBatchRetentionDate = 60;
@KjbPropertyValue(key = "kjb.ums.host")
@Pattern(regexp = "^(https?://[^\\s/$.?#][^\\s]*)|\\s*$", message = "kjb.ums.host_url 는 유효한 URL 형식이거나 공백이어야 합니다. 예: http://example.com/api")
private String umsHostUrl;
@KjbPropertyValue(key = "kjb.ums.api_key")
@Pattern(regexp = "^[a-zA-Z0-9_-]{36}$", message = "kjb.ums.api_key 입력 형식이 맞지 않습니다.")
private String umsApiKey;
@KjbPropertyValue(key = "kjb.ums.connection_timeout", defaultValue = "5")
@Min(1) @Max(10)
private int umsConnectionTimeout = 5;
@KjbPropertyValue(key = "kjb.ums.response_timeout", defaultValue = "5")
@Min(1) @Max(30)
private int umsResponseTimeout = 5;
@KjbPropertyValue(key = "kjb.ums.timeout", defaultValue = "10")
@Min(1) @Max(30)
private int umsTimeout = 10;
}
@@ -0,0 +1,13 @@
package com.eactive.ext.kjb.common;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface KjbPropertyValue {
String key();
String defaultValue() default "";
}
@@ -15,16 +15,27 @@ import org.apache.hc.core5.util.Timeout;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Comparator;
import java.util.concurrent.*;
import java.util.stream.Stream;
@Slf4j
public class KjbEaiBatchModule {
private final KjbProperty property;
private final CloseableHttpClient httpClient;
private final RequestConfig requestConfig;
private LocalDateTime lastFileRetentionCheckTime;
public KjbEaiBatchModule(@NotNull KjbProperty property) {
@@ -104,4 +115,52 @@ public class KjbEaiBatchModule {
return resMessage;
}
}
/**
* 1시간 주기로 파일 유지 및 삭제 처리
*/
public void processFileRetentionDays() {
if (lastFileRetentionCheckTime == null) {
lastFileRetentionCheckTime = LocalDateTime.now();
}
// 현재 시간과 1시간 이상 차이 날때 동작
LocalDateTime now = LocalDateTime.now();
boolean isOver = Duration.between(lastFileRetentionCheckTime, now).abs().toHours() == 1;
if (!isOver) return;
this.walkDeletePath(property.getUmsEaiBatchSendDir());
this.walkDeletePath(property.getUmsEaiBatchBackupDir());
this.walkDeletePath(property.getUmsEaiBatchErrorDir());
lastFileRetentionCheckTime = now;
}
private void walkDeletePath(String path) {
final int retentionDays = property.getUmsEaiBatchRetentionDate();
log.info("WalkDelete - {} / Retention days : {}", path, retentionDays);
Path dir = Paths.get(path);
LocalDateTime now = LocalDateTime.now();
try (Stream<Path> paths = Files.walk(dir)) {
paths.sorted(Comparator.reverseOrder()).forEach(p -> {
try {
BasicFileAttributes attrs = Files.readAttributes(p, BasicFileAttributes.class);
LocalDateTime created = attrs.creationTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
long over = Math.abs(Duration.between(created, now).toDays());
if (over >= retentionDays) {
Files.deleteIfExists(p);
log.info("Delete over {} days - {}", retentionDays, p);
}
} catch (Exception e) {
log.warn("Delete fail - {}", p.getFileName().toString(), e);
}
});
} catch (IOException e) {
log.warn("Not found path : {}", path);
}
}
}
@@ -0,0 +1,35 @@
package com.eactive.ext.kjb.utils;
import com.eactive.ext.kjb.common.KjbProperty;
import com.eactive.ext.kjb.common.KjbPropertyValue;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
public class KjbPropertyUtil {
public static void main(String[] args) {
Class<?> clazz = KjbProperty.class;
StringBuilder sb = new StringBuilder();
for (Field field : clazz.getDeclaredFields()) {
KjbPropertyValue anno = field.getAnnotation(KjbPropertyValue.class);
if (anno != null) {
sb.append("insert into EMSADM.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', ");
String key = anno.key();
String defValue = anno.defaultValue();
if (StringUtils.isEmpty(defValue)) defValue = "";
sb.append("'").append(key).append("', '").append(addQuote(defValue)).append("');\n");
}
}
System.out.println(sb);
}
private static String addQuote(String str) {
return str.replace("'", "''");
}
}