From 3d29407a47f7c46a039ba6b09af6739cca2aaf1c Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 6 Feb 2026 13:37:48 +0900 Subject: [PATCH] =?UTF-8?q?AlarmStateManager=20=EC=8A=A4=ED=94=84=EB=A7=81?= =?UTF-8?q?bean=20=EC=95=84=EB=8B=8C=20=EA=B3=B3=EC=97=90=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=A0=EC=88=98=EC=9E=88=EB=8F=84=EB=A1=9D=20getAla?= =?UTF-8?q?rmStateManager()=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); }