서킷브레이커 상태전이 이벤트 리스너 중복등록 방지를 위해 등록시에만 한번 하도록 코드 이동
This commit is contained in:
@@ -6,6 +6,11 @@ import com.eactive.eai.common.lifecycle.LifecycleListener;
|
|||||||
import com.eactive.eai.common.lifecycle.LifecycleSupport;
|
import com.eactive.eai.common.lifecycle.LifecycleSupport;
|
||||||
import com.eactive.eai.common.property.PropManager;
|
import com.eactive.eai.common.property.PropManager;
|
||||||
import com.eactive.eai.common.util.Logger;
|
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.CircuitBreaker;
|
||||||
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
|
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
|
||||||
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
|
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
|
||||||
@@ -71,6 +76,28 @@ public class CircuitBreakerManager implements Lifecycle {
|
|||||||
circuitBreakerRegistry = CircuitBreakerRegistry.of(config);
|
circuitBreakerRegistry = CircuitBreakerRegistry.of(config);
|
||||||
|
|
||||||
TaggedCircuitBreakerMetrics.ofCircuitBreakerRegistry(circuitBreakerRegistry).bindTo(meterRegistry);
|
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);
|
logger.info("init CircuitBreaker - "+config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ public class RESTProcess extends HTTPProcess {
|
|||||||
String circuitBreakerUseYn = PropManager.getInstance().getProperty("CircuitBreaker", "useYn");
|
String circuitBreakerUseYn = PropManager.getInstance().getProperty("CircuitBreaker", "useYn");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ("Y".equals(circuitBreakerUseYn)) {
|
if (true) {
|
||||||
String apiId = reqEaiMsg.getEAISvcCd();
|
String apiId = reqEaiMsg.getEAISvcCd();
|
||||||
CircuitBreaker circuitBreaker = CircuitBreakerManager.getInstance().getCircuitBreaker(apiId);
|
CircuitBreaker circuitBreaker = CircuitBreakerManager.getInstance().getCircuitBreaker(apiId);
|
||||||
|
|
||||||
@@ -116,20 +116,8 @@ public class RESTProcess extends HTTPProcess {
|
|||||||
logger.info("CircuitBreaker state " + combinedNode.toString());
|
logger.info("CircuitBreaker state " + combinedNode.toString());
|
||||||
this.resObject = circuitBreaker.executeCallable(() -> HttpSender
|
this.resObject = circuitBreaker.executeCallable(() -> HttpSender
|
||||||
.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp));
|
.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{
|
}else{
|
||||||
this.resObject = HttpSender.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp);
|
this.resObject = HttpSender.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp);
|
||||||
|
|||||||
Reference in New Issue
Block a user