From fcedbabfc9d1cc7dc77f89d0493257500ca29d3f Mon Sep 17 00:00:00 2001 From: cho Date: Thu, 5 Feb 2026 17:56:34 +0900 Subject: [PATCH 1/9] =?UTF-8?q?UMS=20=EC=97=B0=EA=B3=84=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B4=EA=B4=80=20(admin-portal->oline-common)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eai/custom/alarm/ums/IUmsGsonObject.java | 7 + .../alarm/ums/ObpMonitoringUmsTemplate.java | 12 ++ .../eai/custom/alarm/ums/UmsBizWorkCode.java | 19 +++ .../eai/custom/alarm/ums/UmsCallResult.java | 18 +++ .../custom/alarm/ums/UmsRequestPayload.java | 103 ++++++++++++++ .../eai/custom/alarm/ums/UmsService.java | 133 ++++++++++++++++++ .../eai/custom/alarm/ums/ValidationUtil.java | 53 +++++++ .../alarm/ums/VerifyPhoneUmsTemplate.java | 12 ++ 8 files changed, 357 insertions(+) create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/IUmsGsonObject.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/ObpMonitoringUmsTemplate.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/UmsBizWorkCode.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/UmsCallResult.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/UmsRequestPayload.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/ValidationUtil.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/VerifyPhoneUmsTemplate.java diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/IUmsGsonObject.java b/src/main/java/com/eactive/eai/custom/alarm/ums/IUmsGsonObject.java new file mode 100644 index 0000000..58037b1 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/IUmsGsonObject.java @@ -0,0 +1,7 @@ +package com.eactive.eai.custom.alarm.ums; + +/** + * GSON Serialize 용 Object + */ +public interface IUmsGsonObject { +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/ObpMonitoringUmsTemplate.java b/src/main/java/com/eactive/eai/custom/alarm/ums/ObpMonitoringUmsTemplate.java new file mode 100644 index 0000000..1570885 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/ObpMonitoringUmsTemplate.java @@ -0,0 +1,12 @@ +package com.eactive.eai.custom.alarm.ums; + +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class ObpMonitoringUmsTemplate implements IUmsGsonObject { + @SerializedName("MOTR_EVAL_CNTN") + private String message; +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsBizWorkCode.java b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsBizWorkCode.java new file mode 100644 index 0000000..898f4b6 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsBizWorkCode.java @@ -0,0 +1,19 @@ +package com.eactive.eai.custom.alarm.ums; + +import lombok.Getter; + +public enum UmsBizWorkCode { + MONITORING("B_ELFN_09510", "OBP 모니터링"), + VERIFY_PHONE("S55_ICT_0006", "API Portal 인증번호"), + ; + + @Getter + private String code; + @Getter + private String displayName; + + UmsBizWorkCode(String code, String displayName) { + this.code = code; + this.displayName = displayName; + } +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsCallResult.java b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsCallResult.java new file mode 100644 index 0000000..f63b6d8 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsCallResult.java @@ -0,0 +1,18 @@ +package com.eactive.eai.custom.alarm.ums; + + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class UmsCallResult { + private String umsMessageId; + private boolean isSuccess; + + private String returnCode; + private String returnMessage; + private String returnPayload; + + private Throwable throwable; +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsRequestPayload.java b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsRequestPayload.java new file mode 100644 index 0000000..6e11bd1 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsRequestPayload.java @@ -0,0 +1,103 @@ +package com.eactive.eai.custom.alarm.ums; + +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotEmpty; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Data +@Builder +@Getter +public class UmsRequestPayload { + // MSG_IDNT_NO string 메시지식별번호 50 O "발송 구분을 위한 거래 번호 (GUID 권고) + //GUID로 입력이 어려울시 + //어플리케이션코드(3자리)+난수 로 유니크한 ID로 채번 권고" + @Length(min = 1, max = 50) + @NotEmpty + @SerializedName("MSG_IDNT_NO") + private String messageIdentityNo; + + // MSG_BZWK_CD string 메시지업무코드 30 O UMS에 등록된 메시지업무코드(AS-IS 템플릿ID) + @NotEmpty + @Length(min = 1, max = 30) + @SerializedName("MSG_BZWK_CD") + private String msgBizWorkCode; + + // 메시지업무파라미터내용 / 4000 / JSONObject + // MSG_BZWK_PARAM_CTNT object 메시지업무파라미터내용 4000 메시지업무코드의 템플릿에서 사용하는 변수와 변수값 + @NotNull + @SerializedName("MSG_BZWK_PARAM_CTNT") + private IUmsGsonObject content; + + // 발송예약일시 / 14 / 실 발송 일자(yyyyMMddHHmmss) + // SND_RESR_DTTM string 발송예약일시 14 20240418111500 O 실 발송 일자(현재시간) + @Pattern(regexp = "^[0-9]{14}$") + @NotEmpty + @SerializedName("SND_RESR_DTTM") + @Builder.Default + private String sendReservationDatetime = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now()); + + // 휴대전화번호 / 44 / 휴대폰번호(평문, 암호화 둘다가능) + // CPNO string 휴대전화번호 44 "암호화 또는 평문 (safedb not rrno) + //문자일 시 암호문 + //숫자일 시 전화번호 + //고객번호 또는 휴대전화번호 필수" + @NotEmpty + @Pattern(regexp = "^[0-9]{10,11}$") + @SerializedName("CPNO") + private String cellphone; + + // 발송부점코드 / 4 / + // SND_BRCD string 발송부점코드 4 O 0333 + @NotEmpty + @SerializedName("SND_BRCD") + @Builder.Default + private String sendBranchCode = "0990"; + + // 발송직원번호 / 7 / ECEB057(텔러번호?) + // SND_EMPNO string 발송직원번호 7 O ? 넣긴해야함 + @NotEmpty + @SerializedName("SND_EMPNO") + @Builder.Default + private String sendEmployeeNo = "ECEB057"; + + // SRVC_ID string 서비스ID 11 요청단 측 서비스ID + @NotEmpty + @SerializedName("SRVC_ID") + @Builder.Default + private String serviceId = "eAPIM"; + + // MSG_SND_CHNL_CD string 메시지발송채널코드 2 + @SerializedName("MSG_SND_CHNL_CD") + @NotNull + @Builder.Default + private ChannelCode msgSndChnlCd = ChannelCode.KM; + + // VALDTN_RSLT_CD string 검증결과코드 2 00으로 고정 + @SerializedName("VALDTN_RSLT_CD") + @NotEmpty + @Builder.Default + private String validationResultCode = "00"; + + public enum ChannelCode { + SM, // SMS + LM, // LMS + MM, // MMS + KM, // 카카오-알림톡 + FM, // 카카오-친구톡 + SR, // RCS-SMS + LR, // RCS-LMS + MR, // RCS-MMS + TR, // RCS-TEMPLATE + IR, // RCS-IMAGE Template + PM // Push + } +} + diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java new file mode 100644 index 0000000..08b6135 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java @@ -0,0 +1,133 @@ +package com.eactive.eai.custom.alarm.ums; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.entity.EntityBuilder; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.ProtocolException; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.apache.hc.core5.util.Timeout; +import org.springframework.stereotype.Component; +import org.springframework.util.StreamUtils; + +import com.eactive.eai.common.util.Logger; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + +@Component +public class UmsService { + + protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + + private final static String UMS_URL = "http://172.31.35.144:9021"; + private final static String API_KEY = "API_KEY"; + private final static String SEND_URL = "/ums/openapi/send"; + private final static String CONTENT_TYPE = "application/json; charset=utf-8"; + private final static String AUTHORIZATION_FMT = "Bearer %s"; + + Future send(String cpno, String message, UmsBizWorkCode code) throws Exception { + + if (message == null) { + throw new IllegalArgumentException("content is null"); + } + + String guid = String.format("APM-%s", + DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now())); + + UmsRequestPayload payload = UmsRequestPayload.builder().messageIdentityNo(guid).msgBizWorkCode(code.getCode()) + .content(ObpMonitoringUmsTemplate.builder().message(message).build()).cellphone(cpno) + .msgSndChnlCd(UmsRequestPayload.ChannelCode.KM).build(); + + try { + ValidationUtil.validateOrThrow(payload); + } catch (Exception ex) { + logger.debug(String.format("UMS Request payload validation failed - %s", payload)); + throw ex; + } + + return call(SEND_URL, payload); + } + + private CloseableHttpClient createHttpClient() { + return HttpClients.createDefault(); + } + + private Future call(String url, UmsRequestPayload requestPayload) throws Exception { + + ExecutorService executor = Executors.newSingleThreadExecutor(); + Gson gson = new Gson(); + String json = gson.toJson(requestPayload); + + HttpPost httpPost = new HttpPost(UMS_URL + url); + httpPost.setHeader("Content-Type", CONTENT_TYPE); + httpPost.setHeader("Authorization", String.format(AUTHORIZATION_FMT, API_KEY)); + httpPost.setEntity(EntityBuilder.create().setText(json).setContentType(ContentType.APPLICATION_JSON).build()); + + if (logger.isDebugEnabled()) { + try { + logger.debug("Header - {}", httpPost.getHeader("Content-Type")); + logger.debug("Header - {}", httpPost.getHeader("Authorization")); + logger.debug("Request Body : {}", + StreamUtils.copyToString(httpPost.getEntity().getContent(), Charset.defaultCharset())); + } catch (ProtocolException | IOException e) { + throw new RuntimeException(e); + } + } + + httpPost.setConfig(RequestConfig.custom().setConnectTimeout(Timeout.ofSeconds(3)) + .setResponseTimeout(Timeout.ofSeconds(3)).build()); + Future future; + try (CloseableHttpClient httpClient = createHttpClient()) { + future = executor.submit(() -> { + return httpClient.execute(httpPost, res -> { + try { + UmsCallResult result; + String body = EntityUtils.toString(res.getEntity()); + if (logger.isDebugEnabled()) { + logger.debug("Response - {}", body); + } + result = gson.fromJson(body, UmsCallResult.class); + result.setUmsMessageId(requestPayload.getMessageIdentityNo()); + result.setSuccess(true); + return result; + } catch (JsonSyntaxException e) { + logger.error("UMS Call error(JSON Syntax)", e); + return UmsCallResult.builder().umsMessageId(requestPayload.getMessageIdentityNo()) + .isSuccess(false).throwable(e).build(); + } catch (Exception e) { + logger.error("UMS Call error", e); + return UmsCallResult.builder().umsMessageId(requestPayload.getMessageIdentityNo()) + .isSuccess(false).throwable(e).build(); + } finally { + logger.debug("Response status - {}", res.getCode()); + + if (res.getCode() != 200) { + Arrays.asList(res.getHeaders()).forEach(o -> { + logger.warn("[Header] {}: {}", o.getName(), o.getValue()); + }); + } + } + }); + }); + + return future; + } catch (Exception e) { + logger.error("UMS call exception", e); + throw new Exception("UMS call failed", e); + } finally { + executor.shutdown(); + } + + } +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/ValidationUtil.java b/src/main/java/com/eactive/eai/custom/alarm/ums/ValidationUtil.java new file mode 100644 index 0000000..7aacc4f --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/ValidationUtil.java @@ -0,0 +1,53 @@ +package com.eactive.eai.custom.alarm.ums; + +import java.util.Set; +import java.util.stream.Collectors; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + +import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; + +public class ValidationUtil { + private static final ValidatorFactory factory; + private static final Validator validator; + + static { + factory = Validation.byDefaultProvider() + .configure() + .messageInterpolator(new ParameterMessageInterpolator()) + .buildValidatorFactory(); + + validator = factory.getValidator(); + } + + + private ValidationUtil() { + } + + + public static Set> validate(T target) { + return validator.validate(target); + } + + public static void validateOrThrow(T target) { + Set> violations = validate(target); + if (!violations.isEmpty()) { + String message = violations.stream() + .map(v -> v.getPropertyPath() + " : " + v.getMessage()) + .collect(Collectors.joining(", ")); + throw new ConstraintViolationException("Validation failed: " + message, violations); + } + } + + public static String getViolationMessage(T target) { + Set> violations = validate(target); + if (violations.isEmpty()) return null; + return violations.stream() + .map(v -> v.getPropertyPath() + " : " + v.getMessage()) + .collect(Collectors.joining(", ")); + } +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/VerifyPhoneUmsTemplate.java b/src/main/java/com/eactive/eai/custom/alarm/ums/VerifyPhoneUmsTemplate.java new file mode 100644 index 0000000..7af2586 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/VerifyPhoneUmsTemplate.java @@ -0,0 +1,12 @@ +package com.eactive.eai.custom.alarm.ums; + +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class VerifyPhoneUmsTemplate implements IUmsGsonObject { + @SerializedName("ATHN_NO") + private String authNumber; +} From 0340f63a799d3a81071b73a3495a707b7d0cc474 Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 6 Feb 2026 09:43:58 +0900 Subject: [PATCH 2/9] =?UTF-8?q?ums=20Alarm=20=EC=9E=91=EC=97=85..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/eactive/eai/common/util/Jsons.java | 10 +++ .../eai/custom/alarm/AlarmService.java | 80 ++++++++++++++++++ .../eai/custom/alarm/AlarmStateManager.java | 78 +++++++++++++++++ .../alarm/condition/AlarmCondition.java | 19 +++++ .../custom/alarm/condition/AlarmLevel.java | 5 ++ .../eai/custom/alarm/event/AlarmEvent.java | 37 +++++++++ .../eai/custom/alarm/key/AlarmKey.java | 5 ++ .../eai/custom/alarm/key/CoreAlarmKey.java | 9 ++ .../eai/custom/alarm/key/DynamicAlarmKey.java | 30 +++++++ .../eai/custom/alarm/policy/AlarmPolicy.java | 83 +++++++++++++++++++ .../eai/custom/alarm/policy/AlarmType.java | 5 ++ .../custom/alarm/policy/CounterPolicy.java | 39 +++++++++ .../eai/custom/alarm/policy/TimerPolicy.java | 52 ++++++++++++ 13 files changed, 452 insertions(+) create mode 100644 src/main/java/com/eactive/eai/common/util/Jsons.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/AlarmService.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/condition/AlarmLevel.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/policy/AlarmType.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java diff --git a/src/main/java/com/eactive/eai/common/util/Jsons.java b/src/main/java/com/eactive/eai/common/util/Jsons.java new file mode 100644 index 0000000..a9379f4 --- /dev/null +++ b/src/main/java/com/eactive/eai/common/util/Jsons.java @@ -0,0 +1,10 @@ +package com.eactive.eai.common.util; + +import com.google.gson.Gson; + +public final class Jsons { + + private Jsons() {} + + public static final Gson GSON = new Gson(); +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java new file mode 100644 index 0000000..6f28796 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java @@ -0,0 +1,80 @@ +package com.eactive.eai.custom.alarm; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Properties; + +import org.springframework.stereotype.Service; + +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Jsons; +import com.eactive.eai.common.util.Logger; +import com.eactive.eai.custom.alarm.key.DynamicAlarmKey; +import com.eactive.eai.custom.alarm.policy.AlarmPolicy; +import com.eactive.eai.custom.alarm.policy.CounterPolicy; +import com.eactive.eai.custom.alarm.policy.TimerPolicy; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +@Service +public class AlarmService { + + protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + + final static String ALARM_GROUP = "Alarm"; + final static String ALARM_KEY = "Alarm"; + final static String ALARM_RECIVER = "{RECIVER}"; + + public List getAlarmPolicy() { + + List policyList = new ArrayList(); + + try { + + Properties props = PropManager.getInstance().getProperties(ALARM_GROUP); + + props.forEach((key, value) -> { + String keyName = (String) key; + String configStr = (String) value; + + if (keyName.contains(ALARM_RECIVER)) + return; + + policyList.add(buildAlarmPolicy(keyName, configStr)); + + }); + + } catch (Exception e) { + logger.error("getAlarmPolicy fail.", e); + return Collections.EMPTY_LIST; + } + + return null; + } + + AlarmPolicy buildAlarmPolicy(String key, String configJsonStr) { + + JsonObject alarmConfig = Jsons.GSON.fromJson(configJsonStr, JsonObject.class); + + String policyType = alarmConfig.get("type").getAsString(); + int coolDownSec = Optional.ofNullable(alarmConfig.get("coolDownSec")).map(i -> i.getAsInt()).orElse(60); + int thresholdCount = Optional.ofNullable(alarmConfig.get("thresholdCount")).map(i -> i.getAsInt()).orElse(5); + int timeWindowSec = Optional.ofNullable(alarmConfig.get("timeWindowSec")).map(i -> i.getAsInt()).orElse(60); + + AlarmPolicy alarmPolicy; + + if ("CountPolicy".equals(policyType)) { + alarmPolicy = CounterPolicy.builder().alarmKey(new DynamicAlarmKey(key)).coolDownMs(coolDownSec * 1000) + .thresholdCount(thresholdCount).build(); + } else { + alarmPolicy = TimerPolicy.builder().alarmKey(new DynamicAlarmKey(key)).coolDownMs(coolDownSec * 1000) + .timeWindowMs(timeWindowSec * 1000).build(); + } + + return alarmPolicy; + + } +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java new file mode 100644 index 0000000..8d4bfd8 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java @@ -0,0 +1,78 @@ +package com.eactive.eai.custom.alarm; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.springframework.stereotype.Component; + +import com.eactive.eai.common.util.Logger; +import com.eactive.eai.custom.alarm.event.AlarmEvent; + +@Component +public class AlarmStateManager { + + + List registerAlarmList = new ArrayList(); + + private final ScheduledExecutorService scheduler; + + protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + + + public AlarmStateManager() { + + this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = new Thread(r); + t.setName("AlarmStateManager-worker"); + t.setDaemon(false); + return t; + }); + + scheduler.scheduleWithFixedDelay(() -> { + + try { + // === 여기에 지속 실행할 로직 === + fireAlarm(); + + } catch (Throwable e) { + // 반드시 예외 잡기 (안 잡으면 스케줄 자체가 죽음) + logger.error("fireAlarm fail", e); + } + + }, 0, 5, TimeUnit.SECONDS); // 최초 0초, 이후 5초 간격 + } + + + public void onEvnet(AlarmEvent alaramEvent) { + + Optional existEvent = + registerAlarmList.stream() + .filter(e -> e.equals(alaramEvent)) + .findFirst(); + + if (existEvent.isPresent()) { + AlarmEvent event = existEvent.get(); + event.onOcurr(); + } else { + registerAlarmList.add(alaramEvent); + } + + } + + private void fireAlarm() { + + for(AlarmEvent event : registerAlarmList) { + + + + } + + } + + + +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java new file mode 100644 index 0000000..7d852f4 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java @@ -0,0 +1,19 @@ +package com.eactive.eai.custom.alarm.condition; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class AlarmCondition { + AlarmLevel level; + final long ocurredAt; + long lastOcurredAt; + long count = 1; + + public void onOcurr() { + this.lastOcurredAt = System.currentTimeMillis(); + this.count++; + } + +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmLevel.java b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmLevel.java new file mode 100644 index 0000000..f88986a --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmLevel.java @@ -0,0 +1,5 @@ +package com.eactive.eai.custom.alarm.condition; + +public enum AlarmLevel { + ERROR, WARN, FATAL +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java new file mode 100644 index 0000000..1d29a3f --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java @@ -0,0 +1,37 @@ +package com.eactive.eai.custom.alarm.event; + +import java.util.Objects; + +import com.eactive.eai.custom.alarm.condition.AlarmCondition; +import com.eactive.eai.custom.alarm.key.AlarmKey; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@Builder +public class AlarmEvent { + AlarmKey key; + AlarmCondition condition; + String message; + + public void onOcurr() { + condition.onOcurr(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AlarmEvent)) return false; + + AlarmEvent that = (AlarmEvent) o; + return Objects.equals(this.key, that.key); + } + + @Override + public int hashCode() { + return Objects.hash(key); + } +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java b/src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java new file mode 100644 index 0000000..c81778a --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java @@ -0,0 +1,5 @@ +package com.eactive.eai.custom.alarm.key; + +public interface AlarmKey { + String code(); +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java b/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java new file mode 100644 index 0000000..eae718b --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java @@ -0,0 +1,9 @@ +package com.eactive.eai.custom.alarm.key; +public enum CoreAlarmKey implements AlarmKey { + CircuitBreaker; + + @Override + public String code() { + return name(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java b/src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java new file mode 100644 index 0000000..c26298b --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java @@ -0,0 +1,30 @@ +package com.eactive.eai.custom.alarm.key; + +public final class DynamicAlarmKey implements AlarmKey { + + private final String code; + + public DynamicAlarmKey(String code) { + if (code == null || code.isEmpty()) { + throw new IllegalArgumentException("AlarmKey code must not be empty"); + } + this.code = code; + } + + @Override + public String code() { + return code; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AlarmKey)) return false; + return code.equals(((AlarmKey) o).code()); + } + + @Override + public int hashCode() { + return code.hashCode(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java new file mode 100644 index 0000000..2f42186 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java @@ -0,0 +1,83 @@ +package com.eactive.eai.custom.alarm.policy; + +import com.eactive.eai.custom.alarm.event.AlarmEvent; +import com.eactive.eai.custom.alarm.key.AlarmKey; + +public abstract class AlarmPolicy { + + private AlarmKey alarmKey; + + private int thresholdCount; + + private long timeWindowMs; + + private long coolDownMs; + + protected AlarmPolicy(Builder builder) { + this.alarmKey = builder.alarmKey; + this.thresholdCount = builder.thresholdCount; + this.timeWindowMs = builder.timeWindowMs; + this.coolDownMs = builder.coolDownMs; + } + + public AlarmKey getAlarmKey() { + return alarmKey; + } + + public int getThresholdCount() { + return thresholdCount; + } + + public long getTimeWindowMs() { + return timeWindowMs; + } + + public long getCoolDownMs() { + return coolDownMs; + } + + abstract boolean isAlarmTriggered(AlarmEvent event); + + public boolean hasElapsed(long baseTimeMs, long currentTimeMs) { + + return currentTimeMs - baseTimeMs >= timeWindowMs; + + } + + public boolean hasExceededLimit(long count) { + return count >= thresholdCount; + } + + public abstract static class Builder> { + + private AlarmKey alarmKey; + private int thresholdCount; + private long timeWindowMs; + private long coolDownMs; + + public T alarmKey(AlarmKey alarmKey) { + this.alarmKey = alarmKey; + return self(); + } + + public T thresholdCount(int thresholdCount) { + this.thresholdCount = thresholdCount; + return self(); + } + + public T timeWindowMs(long timeWindowMs) { + this.timeWindowMs = timeWindowMs; + return self(); + } + + public T coolDownMs(long coolDownMs) { + this.coolDownMs = coolDownMs; + return self(); + } + + protected abstract T self(); + + abstract AlarmPolicy build(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmType.java b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmType.java new file mode 100644 index 0000000..547eaf2 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmType.java @@ -0,0 +1,5 @@ +package com.eactive.eai.custom.alarm.policy; + +public enum AlarmType { + COUNT, TIMER +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java new file mode 100644 index 0000000..97f763d --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java @@ -0,0 +1,39 @@ +package com.eactive.eai.custom.alarm.policy; + +import com.eactive.eai.custom.alarm.event.AlarmEvent; + +public class CounterPolicy extends AlarmPolicy { + + private CounterPolicy(Builder builder) { + super(builder); + } + + @Override + boolean isAlarmTriggered(AlarmEvent event) { + + if (!event.equals(getAlarmKey())) { + return false; + } + + long count = event.getCondition().getCount(); + return hasExceededLimit(count); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder extends AlarmPolicy.Builder { + + @Override + protected Builder self() { + return this; + } + + @Override + public CounterPolicy build() { + return new CounterPolicy(this); + } + } + +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java new file mode 100644 index 0000000..b56dde7 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java @@ -0,0 +1,52 @@ +package com.eactive.eai.custom.alarm.policy; + +import com.eactive.eai.custom.alarm.condition.AlarmCondition; +import com.eactive.eai.custom.alarm.event.AlarmEvent; +import com.eactive.eai.custom.alarm.policy.CounterPolicy.Builder; + +public class TimerPolicy extends AlarmPolicy { + + private TimerPolicy(Builder builder) { + super(builder); + } + + @Override + boolean isAlarmTriggered(AlarmEvent event) { + + if (event.equals(getAlarmKey())) { + + AlarmCondition condition = event.getCondition(); + + long baseTimeMs = condition.getOcurredAt(); + long lastTimeMs = condition.getLastOcurredAt(); + + if (hasElapsed(baseTimeMs, lastTimeMs)) { + return true; + } else { + return false; + } + + } + + return false; + + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder extends AlarmPolicy.Builder { + + @Override + protected Builder self() { + return this; + } + + @Override + public TimerPolicy build() { + return new TimerPolicy(this); + } + } + +} From 94b22aa90f2582a1e55755b69dca7b254ac5adae Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 6 Feb 2026 11:55:27 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=84=B1?= =?UTF-8?q?=EA=B2=A9=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=B0=9C=EC=86=A1?= =?UTF-8?q?=EC=A0=95=EC=B1=85(SendPolicy)=EB=A5=BC=20=EB=91=90=EA=B3=A0=20?= =?UTF-8?q?=EA=B7=B8=EC=97=90=20=EB=94=B0=EB=9D=BC=20UMS=EC=97=B0=EA=B3=84?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EB=AC=B8=EC=9E=90=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20=EB=B0=9C=EC=86=A1=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UMS playload관련 패키지 이동. --- .../eai/custom/alarm/AlarmService.java | 68 +++++++-- .../eai/custom/alarm/AlarmStateManager.java | 144 +++++++++++------- .../alarm/condition/AlarmCondition.java | 5 +- .../eai/custom/alarm/event/AlarmEvent.java | 4 + .../eai/custom/alarm/key/CoreAlarmKey.java | 15 +- .../eai/custom/alarm/policy/AlarmPolicy.java | 8 +- .../custom/alarm/policy/CounterPolicy.java | 2 +- .../eai/custom/alarm/policy/SendPolicy.java | 22 +++ .../eai/custom/alarm/policy/TimerPolicy.java | 5 +- .../eai/custom/alarm/ums/UmsSendManager.java | 62 ++++++++ .../eai/custom/alarm/ums/UmsService.java | 24 ++- .../ums/{ => payload}/IUmsGsonObject.java | 2 +- .../ObpMonitoringUmsTemplate.java | 2 +- .../ums/{ => payload}/UmsBizWorkCode.java | 2 +- .../ums/{ => payload}/UmsRequestPayload.java | 8 +- .../ums/{ => payload}/ValidationUtil.java | 2 +- .../{ => payload}/VerifyPhoneUmsTemplate.java | 2 +- 17 files changed, 277 insertions(+), 100 deletions(-) create mode 100644 src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java create mode 100644 src/main/java/com/eactive/eai/custom/alarm/ums/UmsSendManager.java rename src/main/java/com/eactive/eai/custom/alarm/ums/{ => payload}/IUmsGsonObject.java (59%) rename src/main/java/com/eactive/eai/custom/alarm/ums/{ => payload}/ObpMonitoringUmsTemplate.java (83%) rename src/main/java/com/eactive/eai/custom/alarm/ums/{ => payload}/UmsBizWorkCode.java (88%) rename src/main/java/com/eactive/eai/custom/alarm/ums/{ => payload}/UmsRequestPayload.java (91%) rename src/main/java/com/eactive/eai/custom/alarm/ums/{ => payload}/ValidationUtil.java (97%) rename src/main/java/com/eactive/eai/custom/alarm/ums/{ => payload}/VerifyPhoneUmsTemplate.java (82%) diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java index 6f28796..cc07095 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java @@ -1,9 +1,11 @@ package com.eactive.eai.custom.alarm; -import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Properties; @@ -12,11 +14,12 @@ import org.springframework.stereotype.Service; import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.Jsons; import com.eactive.eai.common.util.Logger; +import com.eactive.eai.custom.alarm.key.AlarmKey; import com.eactive.eai.custom.alarm.key.DynamicAlarmKey; import com.eactive.eai.custom.alarm.policy.AlarmPolicy; import com.eactive.eai.custom.alarm.policy.CounterPolicy; +import com.eactive.eai.custom.alarm.policy.SendPolicy; import com.eactive.eai.custom.alarm.policy.TimerPolicy; -import com.google.gson.Gson; import com.google.gson.JsonObject; @Service @@ -28,9 +31,9 @@ public class AlarmService { final static String ALARM_KEY = "Alarm"; final static String ALARM_RECIVER = "{RECIVER}"; - public List getAlarmPolicy() { + public Map getAlarmPolicy() { - List policyList = new ArrayList(); + Map policyMap = new HashMap(); try { @@ -40,22 +43,24 @@ public class AlarmService { String keyName = (String) key; String configStr = (String) value; - if (keyName.contains(ALARM_RECIVER)) - return; + if (keyName.contains(ALARM_RECIVER)) return; - policyList.add(buildAlarmPolicy(keyName, configStr)); + AlarmPolicy newPolicy = buildAlarmPolicy(keyName, configStr); + + + policyMap.put(newPolicy.getAlarmKey(), newPolicy); }); } catch (Exception e) { - logger.error("getAlarmPolicy fail.", e); - return Collections.EMPTY_LIST; + logger.warn("getAlarmPolicy fail.", e); + return Collections.EMPTY_MAP; } - return null; + return policyMap; } - AlarmPolicy buildAlarmPolicy(String key, String configJsonStr) { + private AlarmPolicy buildAlarmPolicy(String key, String configJsonStr) { JsonObject alarmConfig = Jsons.GSON.fromJson(configJsonStr, JsonObject.class); @@ -77,4 +82,45 @@ public class AlarmService { return alarmPolicy; } + + public Map getSendPolicy() { + + Map policyMap = new HashMap(); + + try { + + Properties props = PropManager.getInstance().getProperties(ALARM_GROUP); + + props.forEach((key, value) -> { + String keyName = (String) key; + String configStr = (String) value; + + if (!keyName.contains(ALARM_RECIVER)) return; + + SendPolicy newPolicy = buildSendPolicy(keyName, configStr); + + + policyMap.put(newPolicy.getAlarmKey(), newPolicy); + + }); + + } catch (Exception e) { + logger.warn("getSendPolicy fail.", e); + return Collections.EMPTY_MAP; + } + + return policyMap; + } + + private SendPolicy buildSendPolicy(String key, String configStr) { + + List reciverList = Optional.ofNullable(configStr).map( t -> Arrays.asList(t.split(",")) ).orElse(Collections.EMPTY_LIST); + + key = key.replaceAll(ALARM_RECIVER, "").trim(); + + SendPolicy sendPolicy = new SendPolicy(key, reciverList); + + return sendPolicy; + + } } diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java index 8d4bfd8..ef0e5ed 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java @@ -2,77 +2,117 @@ package com.eactive.eai.custom.alarm; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.eactive.eai.common.util.Logger; import com.eactive.eai.custom.alarm.event.AlarmEvent; +import com.eactive.eai.custom.alarm.key.AlarmKey; +import com.eactive.eai.custom.alarm.policy.AlarmPolicy; +import com.eactive.eai.custom.alarm.policy.CounterPolicy; +import com.eactive.eai.custom.alarm.policy.SendPolicy; +import com.eactive.eai.custom.alarm.ums.UmsService; +import com.eactive.eai.custom.alarm.ums.payload.IUmsGsonObject; +import com.eactive.eai.custom.alarm.ums.payload.ObpMonitoringUmsTemplate; +import com.eactive.eai.custom.alarm.ums.payload.UmsRequestPayload; @Component public class AlarmStateManager { - - - List registerAlarmList = new ArrayList(); - - private final ScheduledExecutorService scheduler; - - protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); - - - public AlarmStateManager() { - - this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { - Thread t = new Thread(r); - t.setName("AlarmStateManager-worker"); - t.setDaemon(false); - return t; - }); - - scheduler.scheduleWithFixedDelay(() -> { - try { - // === 여기에 지속 실행할 로직 === - fireAlarm(); + List registerAlarmList = new ArrayList(); - } catch (Throwable e) { - // 반드시 예외 잡기 (안 잡으면 스케줄 자체가 죽음) - logger.error("fireAlarm fail", e); - } + private final ScheduledExecutorService scheduler; - }, 0, 5, TimeUnit.SECONDS); // 최초 0초, 이후 5초 간격 + protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + + @Autowired + AlarmService alarmService; + + @Autowired + UmsService usmService; + + public AlarmStateManager() { + + this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = new Thread(r); + t.setName("AlarmStateManager-worker"); + t.setDaemon(false); + return t; + }); + + scheduler.scheduleWithFixedDelay(() -> { + + try { + // === 여기에 지속 실행할 로직 === + fireAlarm(); + + } catch (Throwable e) { + // 반드시 예외 잡기 (안 잡으면 스케줄 자체가 죽음) + logger.error("fireAlarm fail", e); + } + + }, 0, 5, TimeUnit.SECONDS); // 최초 0초, 이후 5초 간격 + } + + public void onEvnet(AlarmEvent alaramEvent) { + + Optional existEvent = registerAlarmList.stream().filter(e -> e.equals(alaramEvent)).findFirst(); + + if (existEvent.isPresent()) { + AlarmEvent event = existEvent.get(); + event.onOcurr(); + } else { + registerAlarmList.add(alaramEvent); } - - - public void onEvnet(AlarmEvent alaramEvent) { - - Optional existEvent = - registerAlarmList.stream() - .filter(e -> e.equals(alaramEvent)) - .findFirst(); - if (existEvent.isPresent()) { - AlarmEvent event = existEvent.get(); - event.onOcurr(); - } else { - registerAlarmList.add(alaramEvent); - } + } + + private void fireAlarm() { + + Map alarmPolicyMap = alarmService.getAlarmPolicy(); + Map sendPolicyMap = alarmService.getSendPolicy(); + + for (AlarmEvent event : registerAlarmList) { + + AlarmPolicy alarmPolicy = alarmPolicyMap.get(event.getKey()); + + if (alarmPolicy.isAlarmTriggered(event)) { + + SendPolicy sendPolicy = sendPolicyMap.get(event.getKey()); + + } } - - private void fireAlarm() { - - for(AlarmEvent event : registerAlarmList) { - - - - } - + + } + + private void send(SendPolicy sendPolicy, AlarmEvent event) { + + UmsRequestPayload payload = null; + + try { + + List cellPhoneList = sendPolicy.getCellpohoneList(); + + for (String cellPhone : cellPhoneList) { + + payload = UmsRequestPayload.builder() + .content(ObpMonitoringUmsTemplate.builder().message(event.getMessage()).build()) + .cellphone(cellPhone).build(); + + usmService.send(payload); + } + + } catch (Exception e) { + logger.error(String.format("Alarm message delivery failed (UMS), payload=%s", payload), e); + } - - + } } \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java index 7d852f4..996dbd0 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java +++ b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java @@ -6,9 +6,8 @@ import lombok.Getter; @Builder @Getter public class AlarmCondition { - AlarmLevel level; - final long ocurredAt; - long lastOcurredAt; + final long ocurredAt = System.currentTimeMillis(); + long lastOcurredAt; // 일단, 미사용 long count = 1; public void onOcurr() { diff --git a/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java index 1d29a3f..fa435b8 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java +++ b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java @@ -4,6 +4,8 @@ import java.util.Objects; import com.eactive.eai.custom.alarm.condition.AlarmCondition; import com.eactive.eai.custom.alarm.key.AlarmKey; +import com.eactive.eai.custom.alarm.policy.AlarmPolicy; +import com.eactive.eai.custom.alarm.policy.CounterPolicy; import lombok.Builder; import lombok.Getter; @@ -34,4 +36,6 @@ public class AlarmEvent { public int hashCode() { return Objects.hash(key); } + + } diff --git a/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java b/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java index eae718b..70c5027 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java +++ b/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java @@ -1,9 +1,12 @@ package com.eactive.eai.custom.alarm.key; -public enum CoreAlarmKey implements AlarmKey { - CircuitBreaker; - @Override - public String code() { - return name(); - } +public final class CoreAlarmKey { + + private CoreAlarmKey() { } + + public static final AlarmKey CircuitBreaker = new DynamicAlarmKey("CircuitBreaker"); + + public static final AlarmKey Timeout = new DynamicAlarmKey("Timeout"); + + } \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java index 2f42186..d1230b6 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java @@ -1,5 +1,6 @@ package com.eactive.eai.custom.alarm.policy; +import com.eactive.eai.custom.alarm.condition.AlarmCondition; import com.eactive.eai.custom.alarm.event.AlarmEvent; import com.eactive.eai.custom.alarm.key.AlarmKey; @@ -36,11 +37,12 @@ public abstract class AlarmPolicy { return coolDownMs; } - abstract boolean isAlarmTriggered(AlarmEvent event); + public abstract boolean isAlarmTriggered(AlarmEvent event); + - public boolean hasElapsed(long baseTimeMs, long currentTimeMs) { + public boolean hasElapsed(long baseTimeMs) { - return currentTimeMs - baseTimeMs >= timeWindowMs; + return System.currentTimeMillis() - baseTimeMs >= timeWindowMs; } diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java index 97f763d..65d3f7f 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java @@ -9,7 +9,7 @@ public class CounterPolicy extends AlarmPolicy { } @Override - boolean isAlarmTriggered(AlarmEvent event) { + public boolean isAlarmTriggered(AlarmEvent event) { if (!event.equals(getAlarmKey())) { return false; diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java new file mode 100644 index 0000000..945881d --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java @@ -0,0 +1,22 @@ +package com.eactive.eai.custom.alarm.policy; + +import java.util.ArrayList; +import java.util.List; + +import com.eactive.eai.custom.alarm.key.AlarmKey; +import com.eactive.eai.custom.alarm.key.DynamicAlarmKey; + +import lombok.Getter; + +@Getter +public class SendPolicy { + + final AlarmKey alarmKey; + + final List cellpohoneList = new ArrayList(); + + public SendPolicy(String alarmKey, List cellPhoneList) { + this.alarmKey = new DynamicAlarmKey(alarmKey); + } + +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java index b56dde7..0a51b02 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java @@ -11,16 +11,15 @@ public class TimerPolicy extends AlarmPolicy { } @Override - boolean isAlarmTriggered(AlarmEvent event) { + public boolean isAlarmTriggered(AlarmEvent event) { if (event.equals(getAlarmKey())) { AlarmCondition condition = event.getCondition(); long baseTimeMs = condition.getOcurredAt(); - long lastTimeMs = condition.getLastOcurredAt(); - if (hasElapsed(baseTimeMs, lastTimeMs)) { + if (hasElapsed(baseTimeMs)) { return true; } else { return false; diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsSendManager.java b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsSendManager.java new file mode 100644 index 0000000..dfab3b5 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsSendManager.java @@ -0,0 +1,62 @@ +package com.eactive.eai.custom.alarm.ums; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.eactive.eai.common.util.Logger; +import com.eactive.eai.custom.alarm.ums.payload.UmsRequestPayload; + +@Component +public class UmsSendManager { + + private final ScheduledExecutorService scheduler; + + protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + + Queue queue = new ConcurrentLinkedQueue(); + + @Autowired + UmsService umsService; + + public UmsSendManager() { + this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = new Thread(r); + t.setName("AlarmStateManager-worker"); + t.setDaemon(false); + return t; + }); + + scheduler.scheduleWithFixedDelay(() -> { + + try { + // === 여기에 지속 실행할 로직 === + sendMessage(); + + } catch (Throwable e) { + // 반드시 예외 잡기 (안 잡으면 스케줄 자체가 죽음) + logger.error("fireAlarm fail", e); + } + + }, 0, 5, TimeUnit.SECONDS); // 최초 0초, 이후 5초 간격 + } + + void sendMessage() throws Exception { + UmsRequestPayload payload; + while ((payload = queue.poll()) != null) { + umsService.send(payload); + } + + } + + public void enqueue(UmsRequestPayload payload) { + queue.offer(payload); + } + + +} diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java index 08b6135..4b1b981 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java @@ -2,8 +2,6 @@ package com.eactive.eai.custom.alarm.ums; import java.io.IOException; import java.nio.charset.Charset; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -21,8 +19,10 @@ import org.apache.hc.core5.util.Timeout; import org.springframework.stereotype.Component; import org.springframework.util.StreamUtils; +import com.eactive.eai.common.util.Jsons; import com.eactive.eai.common.util.Logger; -import com.google.gson.Gson; +import com.eactive.eai.custom.alarm.ums.payload.UmsRequestPayload; +import com.eactive.eai.custom.alarm.ums.payload.ValidationUtil; import com.google.gson.JsonSyntaxException; @Component @@ -36,18 +36,16 @@ public class UmsService { private final static String CONTENT_TYPE = "application/json; charset=utf-8"; private final static String AUTHORIZATION_FMT = "Bearer %s"; - Future send(String cpno, String message, UmsBizWorkCode code) throws Exception { + public Future send(UmsRequestPayload payload) throws Exception { - if (message == null) { + if (payload.getContent() == null) { throw new IllegalArgumentException("content is null"); } - String guid = String.format("APM-%s", - DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now())); - UmsRequestPayload payload = UmsRequestPayload.builder().messageIdentityNo(guid).msgBizWorkCode(code.getCode()) - .content(ObpMonitoringUmsTemplate.builder().message(message).build()).cellphone(cpno) - .msgSndChnlCd(UmsRequestPayload.ChannelCode.KM).build(); +// UmsRequestPayload payload = UmsRequestPayload.builder() +// .content(ObpMonitoringUmsTemplate.builder().message(message).build()).cellphone(cpno) +// .build(); try { ValidationUtil.validateOrThrow(payload); @@ -66,8 +64,8 @@ public class UmsService { private Future call(String url, UmsRequestPayload requestPayload) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); - Gson gson = new Gson(); - String json = gson.toJson(requestPayload); + + String json = Jsons.GSON.toJson(requestPayload); HttpPost httpPost = new HttpPost(UMS_URL + url); httpPost.setHeader("Content-Type", CONTENT_TYPE); @@ -97,7 +95,7 @@ public class UmsService { if (logger.isDebugEnabled()) { logger.debug("Response - {}", body); } - result = gson.fromJson(body, UmsCallResult.class); + result = Jsons.GSON.fromJson(body, UmsCallResult.class); result.setUmsMessageId(requestPayload.getMessageIdentityNo()); result.setSuccess(true); return result; diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/IUmsGsonObject.java b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/IUmsGsonObject.java similarity index 59% rename from src/main/java/com/eactive/eai/custom/alarm/ums/IUmsGsonObject.java rename to src/main/java/com/eactive/eai/custom/alarm/ums/payload/IUmsGsonObject.java index 58037b1..a1b7220 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/IUmsGsonObject.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/IUmsGsonObject.java @@ -1,4 +1,4 @@ -package com.eactive.eai.custom.alarm.ums; +package com.eactive.eai.custom.alarm.ums.payload; /** * GSON Serialize 용 Object diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/ObpMonitoringUmsTemplate.java b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/ObpMonitoringUmsTemplate.java similarity index 83% rename from src/main/java/com/eactive/eai/custom/alarm/ums/ObpMonitoringUmsTemplate.java rename to src/main/java/com/eactive/eai/custom/alarm/ums/payload/ObpMonitoringUmsTemplate.java index 1570885..9f5af06 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/ObpMonitoringUmsTemplate.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/ObpMonitoringUmsTemplate.java @@ -1,4 +1,4 @@ -package com.eactive.eai.custom.alarm.ums; +package com.eactive.eai.custom.alarm.ums.payload; import com.google.gson.annotations.SerializedName; import lombok.Builder; diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsBizWorkCode.java b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/UmsBizWorkCode.java similarity index 88% rename from src/main/java/com/eactive/eai/custom/alarm/ums/UmsBizWorkCode.java rename to src/main/java/com/eactive/eai/custom/alarm/ums/payload/UmsBizWorkCode.java index 898f4b6..d669b23 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsBizWorkCode.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/UmsBizWorkCode.java @@ -1,4 +1,4 @@ -package com.eactive.eai.custom.alarm.ums; +package com.eactive.eai.custom.alarm.ums.payload; import lombok.Getter; diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsRequestPayload.java b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/UmsRequestPayload.java similarity index 91% rename from src/main/java/com/eactive/eai/custom/alarm/ums/UmsRequestPayload.java rename to src/main/java/com/eactive/eai/custom/alarm/ums/payload/UmsRequestPayload.java index 6e11bd1..51fc6f6 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsRequestPayload.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/UmsRequestPayload.java @@ -1,4 +1,4 @@ -package com.eactive.eai.custom.alarm.ums; +package com.eactive.eai.custom.alarm.ums.payload; import com.google.gson.annotations.SerializedName; import lombok.Builder; @@ -22,13 +22,15 @@ public class UmsRequestPayload { @Length(min = 1, max = 50) @NotEmpty @SerializedName("MSG_IDNT_NO") - private String messageIdentityNo; + @Builder.Default + private String messageIdentityNo = String.format("APM-%s",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now())); // MSG_BZWK_CD string 메시지업무코드 30 O UMS에 등록된 메시지업무코드(AS-IS 템플릿ID) @NotEmpty @Length(min = 1, max = 30) @SerializedName("MSG_BZWK_CD") - private String msgBizWorkCode; + @Builder.Default + private String msgBizWorkCode = UmsBizWorkCode.MONITORING.getCode(); // 메시지업무파라미터내용 / 4000 / JSONObject // MSG_BZWK_PARAM_CTNT object 메시지업무파라미터내용 4000 메시지업무코드의 템플릿에서 사용하는 변수와 변수값 diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/ValidationUtil.java b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/ValidationUtil.java similarity index 97% rename from src/main/java/com/eactive/eai/custom/alarm/ums/ValidationUtil.java rename to src/main/java/com/eactive/eai/custom/alarm/ums/payload/ValidationUtil.java index 7aacc4f..ecb8cf8 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/ValidationUtil.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/ValidationUtil.java @@ -1,4 +1,4 @@ -package com.eactive.eai.custom.alarm.ums; +package com.eactive.eai.custom.alarm.ums.payload; import java.util.Set; import java.util.stream.Collectors; diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/VerifyPhoneUmsTemplate.java b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/VerifyPhoneUmsTemplate.java similarity index 82% rename from src/main/java/com/eactive/eai/custom/alarm/ums/VerifyPhoneUmsTemplate.java rename to src/main/java/com/eactive/eai/custom/alarm/ums/payload/VerifyPhoneUmsTemplate.java index 7af2586..4840fbf 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/VerifyPhoneUmsTemplate.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/payload/VerifyPhoneUmsTemplate.java @@ -1,4 +1,4 @@ -package com.eactive.eai.custom.alarm.ums; +package com.eactive.eai.custom.alarm.ums.payload; import com.google.gson.annotations.SerializedName; import lombok.Builder; From 3d29407a47f7c46a039ba6b09af6739cca2aaf1c Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 6 Feb 2026 13:37:48 +0900 Subject: [PATCH 4/9] =?UTF-8?q?AlarmStateManager=20=EC=8A=A4=ED=94=84?= =?UTF-8?q?=EB=A7=81bean=20=EC=95=84=EB=8B=8C=20=EA=B3=B3=EC=97=90=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=A0=EC=88=98=EC=9E=88=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20getAlarmStateManager()=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RESTProcess에 circuitbreak시, 이벤트 전달하도록 수정. --- .../eai/custom/alarm/AlarmStateManager.java | 17 ++++++-- .../com/eactive/eai/outbound/RESTProcess.java | 43 ++++++++++++++----- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java index ef0e5ed..0539b15 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java @@ -11,14 +11,14 @@ import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.ApplicationContextProvider; import com.eactive.eai.common.util.Logger; import com.eactive.eai.custom.alarm.event.AlarmEvent; import com.eactive.eai.custom.alarm.key.AlarmKey; import com.eactive.eai.custom.alarm.policy.AlarmPolicy; -import com.eactive.eai.custom.alarm.policy.CounterPolicy; import com.eactive.eai.custom.alarm.policy.SendPolicy; import com.eactive.eai.custom.alarm.ums.UmsService; -import com.eactive.eai.custom.alarm.ums.payload.IUmsGsonObject; import com.eactive.eai.custom.alarm.ums.payload.ObpMonitoringUmsTemplate; import com.eactive.eai.custom.alarm.ums.payload.UmsRequestPayload; @@ -31,12 +31,21 @@ public class AlarmStateManager { protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + private static AlarmStateManager alarmStateManager; + @Autowired AlarmService alarmService; @Autowired UmsService usmService; + public static AlarmStateManager getAlarmStateManager() { + if (alarmStateManager == null) { + alarmStateManager = ApplicationContextProvider.getContext().getBean(AlarmStateManager.class); + } + return alarmStateManager; + } + public AlarmStateManager() { this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { @@ -86,6 +95,7 @@ public class AlarmStateManager { SendPolicy sendPolicy = sendPolicyMap.get(event.getKey()); + send(sendPolicy, event); } } @@ -106,7 +116,8 @@ public class AlarmStateManager { .content(ObpMonitoringUmsTemplate.builder().message(event.getMessage()).build()) .cellphone(cellPhone).build(); - usmService.send(payload); + // usmService.send(payload); + logger.info("UMS Send!!, {}", payload); } } catch (Exception e) { diff --git a/src/main/java/com/eactive/eai/outbound/RESTProcess.java b/src/main/java/com/eactive/eai/outbound/RESTProcess.java index 29bb60a..345de41 100644 --- a/src/main/java/com/eactive/eai/outbound/RESTProcess.java +++ b/src/main/java/com/eactive/eai/outbound/RESTProcess.java @@ -42,6 +42,11 @@ import com.eactive.eai.common.worker.ResponseMap; import com.eactive.eai.control.HttpSender; import com.eactive.eai.control.LogSender; import com.eactive.eai.control.Transform; +import com.eactive.eai.custom.alarm.AlarmStateManager; +import com.eactive.eai.custom.alarm.condition.AlarmCondition; +import com.eactive.eai.custom.alarm.event.AlarmEvent; +import com.eactive.eai.custom.alarm.key.AlarmKey; +import com.eactive.eai.custom.alarm.key.CoreAlarmKey; import com.eactive.eai.env.ElinkConfig; import com.eactive.eai.inbound.processor.Processor; import com.ext.eai.common.stdmessage.STDMessageKeys; @@ -96,20 +101,36 @@ public class RESTProcess extends HTTPProcess { String circuitBreakerUseYn = PropManager.getInstance().getProperty("CircuitBreaker", "useYn"); try { - if("Y".equals(circuitBreakerUseYn)){ - String apiId = reqEaiMsg.getEAISvcCd(); - CircuitBreaker circuitBreaker = CircuitBreakerManager.getInstance().getCircuitBreaker(apiId); + if ("Y".equals(circuitBreakerUseYn)) { + String apiId = reqEaiMsg.getEAISvcCd(); + CircuitBreaker circuitBreaker = CircuitBreakerManager.getInstance().getCircuitBreaker(apiId); - // ObjectMapper 인스턴스 생성 - ObjectMapper objectMapper = new ObjectMapper(); + // ObjectMapper 인스턴스 생성 + ObjectMapper objectMapper = new ObjectMapper(); - // 서킷 브레이커의 메트릭 정보와 상태 정보를 직접 Node로 변환 - ObjectNode combinedNode = objectMapper.createObjectNode(); - combinedNode.put("state", circuitBreaker.getState().toString()); - combinedNode.set("metrics", objectMapper.valueToTree(circuitBreaker.getMetrics())); + // 서킷 브레이커의 메트릭 정보와 상태 정보를 직접 Node로 변환 + ObjectNode combinedNode = objectMapper.createObjectNode(); + combinedNode.put("state", circuitBreaker.getState().toString()); + combinedNode.set("metrics", objectMapper.valueToTree(circuitBreaker.getMetrics())); + + logger.info("CircuitBreaker state " + combinedNode.toString()); + this.resObject = circuitBreaker.executeCallable(() -> HttpSender + .callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp)); + + circuitBreaker.getEventPublisher().onStateTransition(event -> { + CircuitBreaker.State from = event.getStateTransition().getFromState(); + CircuitBreaker.State to = event.getStateTransition().getToState(); + + AlarmEvent alarmEvent = AlarmEvent.builder().key(CoreAlarmKey.CircuitBreaker) + .condition(AlarmCondition.builder().build()) + .message(String.format("CircuitBreaker state changed. apiId=%s, %s -> %s", apiId, from, to)) + .build(); + + AlarmStateManager.getAlarmStateManager().onEvnet(alarmEvent); + + logger.warn("CircuitBreaker state changed. apiId={}, {} -> {}", apiId, from, to); + }); - logger.info("CircuitBreaker state "+combinedNode.toString()); - this.resObject = circuitBreaker.executeCallable(() -> HttpSender.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp)); }else{ this.resObject = HttpSender.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp); } From 700659843a8f58573c81d066f02c4ca434cfb841 Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 6 Feb 2026 15:41:24 +0900 Subject: [PATCH 5/9] =?UTF-8?q?AlarmPolicy=ED=83=80=EC=9E=85("CountPolicy"?= =?UTF-8?q?->"count")=20=EC=88=98=EC=A0=95,?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 너무 길어서.. --- src/main/java/com/eactive/eai/custom/alarm/AlarmService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java index cc07095..bcd00ed 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java @@ -71,7 +71,7 @@ public class AlarmService { AlarmPolicy alarmPolicy; - if ("CountPolicy".equals(policyType)) { + if ("count".equals(policyType)) { alarmPolicy = CounterPolicy.builder().alarmKey(new DynamicAlarmKey(key)).coolDownMs(coolDownSec * 1000) .thresholdCount(thresholdCount).build(); } else { From 554a6667086c1d5d13c234a452aa88739fa8855a Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 6 Feb 2026 16:00:14 +0900 Subject: [PATCH 6/9] =?UTF-8?q?AlamKey=20=EA=B0=92(=EA=B0=99=EC=9D=80?= =?UTF-8?q?=EC=A2=85=EB=A5=98=20=EC=95=8C=EB=9E=8C)=EC=9D=B4=20=EA=B0=99?= =?UTF-8?q?=EB=8D=94=EB=9D=BC=EB=8F=84,=20message=20=EA=B0=80=20=EB=8B=A4?= =?UTF-8?q?=EB=A5=B4=EB=A9=B4=20=EB=94=B0=EB=A1=9C=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D,?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 예시) CircuitBreaker 알람이라도, api에 따라 따로 알람 가야함. Timeout 알람이라도 같은 호스트가 아니면 따로 알람 가야함. --- .../java/com/eactive/eai/custom/alarm/event/AlarmEvent.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java index fa435b8..36f6d74 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java +++ b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java @@ -29,12 +29,13 @@ public class AlarmEvent { if (!(o instanceof AlarmEvent)) return false; AlarmEvent that = (AlarmEvent) o; - return Objects.equals(this.key, that.key); + return Objects.equals(this.key, that.key) + && Objects.equals(this.message, that.message); } @Override public int hashCode() { - return Objects.hash(key); + return Objects.hash(key, message); } From 44238b2c121b9ac49cc38473466bc4210e29d261 Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 6 Feb 2026 16:11:26 +0900 Subject: [PATCH 7/9] =?UTF-8?q?ums=20=EC=8B=A4=EC=A0=9C=20=EB=B3=B4?= =?UTF-8?q?=EB=82=B4=EB=8F=84=EB=A1=9D=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UmsService에서 ums 서버정보 프로퍼티(UMS)에서 받도록 추가. --- .../eai/custom/alarm/AlarmStateManager.java | 3 +-- .../eai/custom/alarm/ums/UmsService.java | 24 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java index 0539b15..5706b5d 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java @@ -116,8 +116,7 @@ public class AlarmStateManager { .content(ObpMonitoringUmsTemplate.builder().message(event.getMessage()).build()) .cellphone(cellPhone).build(); - // usmService.send(payload); - logger.info("UMS Send!!, {}", payload); + usmService.send(payload); } } catch (Exception e) { diff --git a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java index 4b1b981..4368826 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java +++ b/src/main/java/com/eactive/eai/custom/alarm/ums/UmsService.java @@ -19,6 +19,7 @@ import org.apache.hc.core5.util.Timeout; import org.springframework.stereotype.Component; import org.springframework.util.StreamUtils; +import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.Jsons; import com.eactive.eai.common.util.Logger; import com.eactive.eai.custom.alarm.ums.payload.UmsRequestPayload; @@ -30,8 +31,12 @@ public class UmsService { protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + private final static String UMS_GROUP_PROP_NAME = "UMS"; + private final static String UMS_PROP_HOST = "host"; + private final static String UMS_PROP_URL = "url"; + private final static String UMS_PROP_API_KEY = "apiKey"; private final static String UMS_URL = "http://172.31.35.144:9021"; - private final static String API_KEY = "API_KEY"; + private final static String API_KEY = "7cca6d58-e4f7-474d-9edd-525806bc99ff"; private final static String SEND_URL = "/ums/openapi/send"; private final static String CONTENT_TYPE = "application/json; charset=utf-8"; private final static String AUTHORIZATION_FMT = "Bearer %s"; @@ -42,11 +47,6 @@ public class UmsService { throw new IllegalArgumentException("content is null"); } - -// UmsRequestPayload payload = UmsRequestPayload.builder() -// .content(ObpMonitoringUmsTemplate.builder().message(message).build()).cellphone(cpno) -// .build(); - try { ValidationUtil.validateOrThrow(payload); } catch (Exception ex) { @@ -54,22 +54,26 @@ public class UmsService { throw ex; } - return call(SEND_URL, payload); + return call(payload); } private CloseableHttpClient createHttpClient() { return HttpClients.createDefault(); } - private Future call(String url, UmsRequestPayload requestPayload) throws Exception { + private Future call(UmsRequestPayload requestPayload) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); String json = Jsons.GSON.toJson(requestPayload); + + String host = PropManager.getInstance().getProperty(UMS_GROUP_PROP_NAME, UMS_PROP_HOST, UMS_URL); + String url = PropManager.getInstance().getProperty(UMS_GROUP_PROP_NAME, UMS_PROP_URL, SEND_URL); + String apiKey = PropManager.getInstance().getProperty(UMS_GROUP_PROP_NAME, UMS_PROP_API_KEY, API_KEY); - HttpPost httpPost = new HttpPost(UMS_URL + url); + HttpPost httpPost = new HttpPost(host + url); httpPost.setHeader("Content-Type", CONTENT_TYPE); - httpPost.setHeader("Authorization", String.format(AUTHORIZATION_FMT, API_KEY)); + httpPost.setHeader("Authorization", String.format(AUTHORIZATION_FMT, apiKey)); httpPost.setEntity(EntityBuilder.create().setText(json).setContentType(ContentType.APPLICATION_JSON).build()); if (logger.isDebugEnabled()) { From 48fae94b488945189cce1eed4c2809ff4641ccdf Mon Sep 17 00:00:00 2001 From: cho Date: Wed, 11 Feb 2026 13:24:18 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=EC=84=9C=ED=82=B7=EB=B8=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=BB=A4=20=EC=83=81=ED=83=9C=EC=A0=84=EC=9D=B4=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A6=AC=EC=8A=A4=EB=84=88=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=EB=93=B1=EB=A1=9D=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=B4=20=EB=93=B1=EB=A1=9D=EC=8B=9C?= =?UTF-8?q?=EC=97=90=EB=A7=8C=20=ED=95=9C=EB=B2=88=20=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=BD=94=EB=93=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../circuitBreaker/CircuitBreakerManager.java | 27 +++++++++++++++++++ .../com/eactive/eai/outbound/RESTProcess.java | 18 +++---------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/eactive/eai/common/circuitBreaker/CircuitBreakerManager.java b/src/main/java/com/eactive/eai/common/circuitBreaker/CircuitBreakerManager.java index 1b59209..4dce347 100644 --- a/src/main/java/com/eactive/eai/common/circuitBreaker/CircuitBreakerManager.java +++ b/src/main/java/com/eactive/eai/common/circuitBreaker/CircuitBreakerManager.java @@ -6,6 +6,11 @@ import com.eactive.eai.common.lifecycle.LifecycleListener; import com.eactive.eai.common.lifecycle.LifecycleSupport; import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.Logger; +import com.eactive.eai.custom.alarm.AlarmStateManager; +import com.eactive.eai.custom.alarm.condition.AlarmCondition; +import com.eactive.eai.custom.alarm.event.AlarmEvent; +import com.eactive.eai.custom.alarm.key.CoreAlarmKey; + import io.github.resilience4j.circuitbreaker.CircuitBreaker; import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig; import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry; @@ -71,6 +76,28 @@ public class CircuitBreakerManager implements Lifecycle { circuitBreakerRegistry = CircuitBreakerRegistry.of(config); TaggedCircuitBreakerMetrics.ofCircuitBreakerRegistry(circuitBreakerRegistry).bindTo(meterRegistry); + + circuitBreakerRegistry.getEventPublisher().onEntryAdded(event -> { + CircuitBreaker cb = event.getAddedEntry(); + String apiId = cb.getName(); + + // 여기서 상태 변경 리스너를 한 번만 등록 + cb.getEventPublisher().onStateTransition(stateEvent -> { + CircuitBreaker.State from = stateEvent.getStateTransition().getFromState(); + CircuitBreaker.State to = stateEvent.getStateTransition().getToState(); + + AlarmEvent alarmEvent = AlarmEvent.builder().key(CoreAlarmKey.CircuitBreaker) + .condition(AlarmCondition.builder().build()) + .message(String.format("CircuitBreaker state changed. apiId=%s, %s -> %s", apiId, from, to)) + .build(); + + AlarmStateManager.getAlarmStateManager().onEvnet(alarmEvent); + + logger.warn("CircuitBreaker state changed. apiId={}, {} -> {}", apiId, from, to); + }); + + logger.info("Registered StateTransition listener for: {}", apiId); + }); logger.info("init CircuitBreaker - "+config); } diff --git a/src/main/java/com/eactive/eai/outbound/RESTProcess.java b/src/main/java/com/eactive/eai/outbound/RESTProcess.java index 345de41..d22cde9 100644 --- a/src/main/java/com/eactive/eai/outbound/RESTProcess.java +++ b/src/main/java/com/eactive/eai/outbound/RESTProcess.java @@ -101,7 +101,7 @@ public class RESTProcess extends HTTPProcess { String circuitBreakerUseYn = PropManager.getInstance().getProperty("CircuitBreaker", "useYn"); try { - if ("Y".equals(circuitBreakerUseYn)) { + if (true) { String apiId = reqEaiMsg.getEAISvcCd(); CircuitBreaker circuitBreaker = CircuitBreakerManager.getInstance().getCircuitBreaker(apiId); @@ -116,20 +116,8 @@ public class RESTProcess extends HTTPProcess { logger.info("CircuitBreaker state " + combinedNode.toString()); this.resObject = circuitBreaker.executeCallable(() -> HttpSender .callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp)); - - circuitBreaker.getEventPublisher().onStateTransition(event -> { - CircuitBreaker.State from = event.getStateTransition().getFromState(); - CircuitBreaker.State to = event.getStateTransition().getToState(); - - AlarmEvent alarmEvent = AlarmEvent.builder().key(CoreAlarmKey.CircuitBreaker) - .condition(AlarmCondition.builder().build()) - .message(String.format("CircuitBreaker state changed. apiId=%s, %s -> %s", apiId, from, to)) - .build(); - - AlarmStateManager.getAlarmStateManager().onEvnet(alarmEvent); - - logger.warn("CircuitBreaker state changed. apiId={}, {} -> {}", apiId, from, to); - }); + + }else{ this.resObject = HttpSender.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp); From 72d89125975b0730ddb2b559fdf4a5303c5a4f09 Mon Sep 17 00:00:00 2001 From: cho Date: Wed, 11 Feb 2026 13:24:44 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eai/custom/alarm/AlarmService.java | 44 +++++++++++-------- .../eai/custom/alarm/AlarmStateManager.java | 33 ++++++++++---- .../alarm/condition/AlarmCondition.java | 3 ++ .../eai/custom/alarm/event/AlarmEvent.java | 2 + .../eai/custom/alarm/key/AlarmKey.java | 1 + .../eai/custom/alarm/key/CoreAlarmKey.java | 4 +- .../eai/custom/alarm/key/DynamicAlarmKey.java | 3 ++ .../eai/custom/alarm/policy/AlarmPolicy.java | 14 ------ .../custom/alarm/policy/CounterPolicy.java | 2 +- .../eai/custom/alarm/policy/SendPolicy.java | 7 +-- .../eai/custom/alarm/policy/TimerPolicy.java | 2 +- 11 files changed, 67 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java index bcd00ed..7f26e67 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmService.java @@ -28,8 +28,9 @@ public class AlarmService { protected static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); final static String ALARM_GROUP = "Alarm"; - final static String ALARM_KEY = "Alarm"; + final static String ALARM_KEY = "{ALARM}"; final static String ALARM_RECIVER = "{RECIVER}"; + final static String ALARM_EABLE = "enable.alarm"; public Map getAlarmPolicy() { @@ -40,16 +41,16 @@ public class AlarmService { Properties props = PropManager.getInstance().getProperties(ALARM_GROUP); props.forEach((key, value) -> { + String keyName = (String) key; String configStr = (String) value; - if (keyName.contains(ALARM_RECIVER)) return; + if (keyName.contains(ALARM_KEY)) { - AlarmPolicy newPolicy = buildAlarmPolicy(keyName, configStr); - - - policyMap.put(newPolicy.getAlarmKey(), newPolicy); + AlarmPolicy newPolicy = buildAlarmPolicy(keyName, configStr); + policyMap.put(newPolicy.getAlarmKey(), newPolicy); + } }); } catch (Exception e) { @@ -60,29 +61,33 @@ public class AlarmService { return policyMap; } + public boolean isAlarmEnabled() { + return Optional.ofNullable(PropManager.getInstance().getProperty(ALARM_GROUP, ALARM_EABLE)) + .map(Boolean::valueOf).orElse(false); + } + private AlarmPolicy buildAlarmPolicy(String key, String configJsonStr) { JsonObject alarmConfig = Jsons.GSON.fromJson(configJsonStr, JsonObject.class); String policyType = alarmConfig.get("type").getAsString(); - int coolDownSec = Optional.ofNullable(alarmConfig.get("coolDownSec")).map(i -> i.getAsInt()).orElse(60); int thresholdCount = Optional.ofNullable(alarmConfig.get("thresholdCount")).map(i -> i.getAsInt()).orElse(5); int timeWindowSec = Optional.ofNullable(alarmConfig.get("timeWindowSec")).map(i -> i.getAsInt()).orElse(60); AlarmPolicy alarmPolicy; if ("count".equals(policyType)) { - alarmPolicy = CounterPolicy.builder().alarmKey(new DynamicAlarmKey(key)).coolDownMs(coolDownSec * 1000) - .thresholdCount(thresholdCount).build(); + alarmPolicy = CounterPolicy.builder().alarmKey(new DynamicAlarmKey(key)).thresholdCount(thresholdCount) + .build(); } else { - alarmPolicy = TimerPolicy.builder().alarmKey(new DynamicAlarmKey(key)).coolDownMs(coolDownSec * 1000) - .timeWindowMs(timeWindowSec * 1000).build(); + alarmPolicy = TimerPolicy.builder().alarmKey(new DynamicAlarmKey(key)).timeWindowMs(timeWindowSec * 1000) + .build(); } return alarmPolicy; } - + public Map getSendPolicy() { Map policyMap = new HashMap(); @@ -95,11 +100,11 @@ public class AlarmService { String keyName = (String) key; String configStr = (String) value; - if (!keyName.contains(ALARM_RECIVER)) return; + if (!keyName.contains(ALARM_RECIVER)) + return; SendPolicy newPolicy = buildSendPolicy(keyName, configStr); - - + policyMap.put(newPolicy.getAlarmKey(), newPolicy); }); @@ -111,12 +116,13 @@ public class AlarmService { return policyMap; } - + private SendPolicy buildSendPolicy(String key, String configStr) { - List reciverList = Optional.ofNullable(configStr).map( t -> Arrays.asList(t.split(",")) ).orElse(Collections.EMPTY_LIST); - - key = key.replaceAll(ALARM_RECIVER, "").trim(); + List reciverList = Optional.ofNullable(configStr).map(t -> Arrays.asList(t.split(","))) + .orElse(Collections.EMPTY_LIST); + + key = key.replace(ALARM_RECIVER, "").trim() + "{ALARM}"; SendPolicy sendPolicy = new SendPolicy(key, reciverList); diff --git a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java index 5706b5d..719a204 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java +++ b/src/main/java/com/eactive/eai/custom/alarm/AlarmStateManager.java @@ -1,6 +1,7 @@ package com.eactive.eai.custom.alarm; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; @@ -11,7 +12,6 @@ import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.ApplicationContextProvider; import com.eactive.eai.common.util.Logger; import com.eactive.eai.custom.alarm.event.AlarmEvent; @@ -85,19 +85,36 @@ public class AlarmStateManager { private void fireAlarm() { Map alarmPolicyMap = alarmService.getAlarmPolicy(); + Map sendPolicyMap = alarmService.getSendPolicy(); - for (AlarmEvent event : registerAlarmList) { + Iterator iterator = registerAlarmList.iterator(); + while (iterator.hasNext()) { + AlarmEvent event = iterator.next(); AlarmPolicy alarmPolicy = alarmPolicyMap.get(event.getKey()); - if (alarmPolicy.isAlarmTriggered(event)) { - + if (alarmPolicy != null && alarmPolicy.isAlarmTriggered(event)) { + // 알람 발송 로직 SendPolicy sendPolicy = sendPolicyMap.get(event.getKey()); - - send(sendPolicy, event); + if (alarmService.isAlarmEnabled()) { + send(sendPolicy, event); + } else { + logger.info("Alarm is disabled, event = {}, policy = {}", event, sendPolicy); + } + // 리스트에서 안전하게 제거 + iterator.remove(); + }else { //트리거 조건이 안되더라도, 이벤트발생한지 오래 되었으면 제거하여 OOM 예방. + + + long firstOcurredAt = event.getCondition().getOcurredAt(); + + long diffInMs = System.currentTimeMillis() - firstOcurredAt; + + if ( diffInMs >= TimeUnit.MINUTES.toMillis(60) ) { //1시간 지난거면 삭제 + iterator.remove(); + } } - } } @@ -108,7 +125,7 @@ public class AlarmStateManager { try { - List cellPhoneList = sendPolicy.getCellpohoneList(); + List cellPhoneList = sendPolicy.getCellPhoneList(); for (String cellPhone : cellPhoneList) { diff --git a/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java index 996dbd0..2313fdf 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java +++ b/src/main/java/com/eactive/eai/custom/alarm/condition/AlarmCondition.java @@ -2,12 +2,15 @@ package com.eactive.eai.custom.alarm.condition; import lombok.Builder; import lombok.Getter; +import lombok.ToString; @Builder @Getter +@ToString public class AlarmCondition { final long ocurredAt = System.currentTimeMillis(); long lastOcurredAt; // 일단, 미사용 + @Builder.Default long count = 1; public void onOcurr() { diff --git a/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java index 36f6d74..194128d 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java +++ b/src/main/java/com/eactive/eai/custom/alarm/event/AlarmEvent.java @@ -10,10 +10,12 @@ import com.eactive.eai.custom.alarm.policy.CounterPolicy; import lombok.Builder; import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Setter @Getter @Builder +@ToString public class AlarmEvent { AlarmKey key; AlarmCondition condition; diff --git a/src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java b/src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java index c81778a..ddcf0ad 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java +++ b/src/main/java/com/eactive/eai/custom/alarm/key/AlarmKey.java @@ -1,5 +1,6 @@ package com.eactive.eai.custom.alarm.key; + public interface AlarmKey { String code(); } diff --git a/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java b/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java index 70c5027..cc1d79b 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java +++ b/src/main/java/com/eactive/eai/custom/alarm/key/CoreAlarmKey.java @@ -4,9 +4,9 @@ public final class CoreAlarmKey { private CoreAlarmKey() { } - public static final AlarmKey CircuitBreaker = new DynamicAlarmKey("CircuitBreaker"); + public static final AlarmKey CircuitBreaker = new DynamicAlarmKey("CircuitBreaker{ALARM}"); - public static final AlarmKey Timeout = new DynamicAlarmKey("Timeout"); + public static final AlarmKey Timeout = new DynamicAlarmKey("Timeout{ALARM}"); } \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java b/src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java index c26298b..6a76d46 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java +++ b/src/main/java/com/eactive/eai/custom/alarm/key/DynamicAlarmKey.java @@ -1,5 +1,8 @@ package com.eactive.eai.custom.alarm.key; +import lombok.ToString; + +@ToString public final class DynamicAlarmKey implements AlarmKey { private final String code; diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java index d1230b6..3c6dd8f 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/AlarmPolicy.java @@ -1,6 +1,5 @@ package com.eactive.eai.custom.alarm.policy; -import com.eactive.eai.custom.alarm.condition.AlarmCondition; import com.eactive.eai.custom.alarm.event.AlarmEvent; import com.eactive.eai.custom.alarm.key.AlarmKey; @@ -12,13 +11,10 @@ public abstract class AlarmPolicy { private long timeWindowMs; - private long coolDownMs; - protected AlarmPolicy(Builder builder) { this.alarmKey = builder.alarmKey; this.thresholdCount = builder.thresholdCount; this.timeWindowMs = builder.timeWindowMs; - this.coolDownMs = builder.coolDownMs; } public AlarmKey getAlarmKey() { @@ -33,10 +29,6 @@ public abstract class AlarmPolicy { return timeWindowMs; } - public long getCoolDownMs() { - return coolDownMs; - } - public abstract boolean isAlarmTriggered(AlarmEvent event); @@ -55,7 +47,6 @@ public abstract class AlarmPolicy { private AlarmKey alarmKey; private int thresholdCount; private long timeWindowMs; - private long coolDownMs; public T alarmKey(AlarmKey alarmKey) { this.alarmKey = alarmKey; @@ -72,11 +63,6 @@ public abstract class AlarmPolicy { return self(); } - public T coolDownMs(long coolDownMs) { - this.coolDownMs = coolDownMs; - return self(); - } - protected abstract T self(); abstract AlarmPolicy build(); diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java index 65d3f7f..7bf3c0a 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/CounterPolicy.java @@ -11,7 +11,7 @@ public class CounterPolicy extends AlarmPolicy { @Override public boolean isAlarmTriggered(AlarmEvent event) { - if (!event.equals(getAlarmKey())) { + if (!event.getKey().equals(getAlarmKey())) { return false; } diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java index 945881d..592d529 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/SendPolicy.java @@ -1,22 +1,23 @@ package com.eactive.eai.custom.alarm.policy; -import java.util.ArrayList; import java.util.List; import com.eactive.eai.custom.alarm.key.AlarmKey; import com.eactive.eai.custom.alarm.key.DynamicAlarmKey; import lombok.Getter; - +import lombok.ToString; +@ToString @Getter public class SendPolicy { final AlarmKey alarmKey; - final List cellpohoneList = new ArrayList(); + final List cellPhoneList; public SendPolicy(String alarmKey, List cellPhoneList) { this.alarmKey = new DynamicAlarmKey(alarmKey); + this.cellPhoneList = cellPhoneList; } } diff --git a/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java b/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java index 0a51b02..29c719a 100644 --- a/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java +++ b/src/main/java/com/eactive/eai/custom/alarm/policy/TimerPolicy.java @@ -13,7 +13,7 @@ public class TimerPolicy extends AlarmPolicy { @Override public boolean isAlarmTriggered(AlarmEvent event) { - if (event.equals(getAlarmKey())) { + if (event.getKey().equals(getAlarmKey())) { AlarmCondition condition = event.getCondition();