diff --git a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java index 691a213..eee0794 100644 --- a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java +++ b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java @@ -7,6 +7,8 @@ import com.eactive.eai.adapter.http.client.HttpClientAdapterVO; import com.eactive.eai.common.TransactionContextKeys; import com.eactive.eai.common.message.MessageType; import com.eactive.eai.common.util.CommonLib; +import com.eactive.eai.common.util.TxFileLogger; + import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; @@ -118,7 +120,9 @@ public class HttpClient5AdapterServiceBody extends HttpClient5AdapterServiceSupp HttpMemoryLogger.txlog(vo.getAdapterGroupName() + vo.getAdapterName(), "SEND [" + sendData + "]" + CommonLib.getDumpMessage(sendData)); } - + + TxFileLogger.logTxFile(tempProp, sendData, "[OUT_SEND]"); + String uuid = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID); HttpContext context = new BasicHttpContext(); context.setAttribute(TransactionContextKeys.TRANSACTION_UUID, uuid); @@ -147,7 +151,8 @@ public class HttpClient5AdapterServiceBody extends HttpClient5AdapterServiceSupp } stopWatch.stop(); - + TxFileLogger.logTxFile(tempProp, responseString, "[OUT_RECV]"); + if (status >= 400 && status < 500) { String errMsg = String.format( diff --git a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java index cefe58d..68ce6bf 100644 --- a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java +++ b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java @@ -75,6 +75,7 @@ import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.message.MessageType; import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.CommonLib; +import com.eactive.eai.common.util.TxFileLogger; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import com.kjbank.encrypt.exchange.crypto.AES256Cipher; @@ -427,6 +428,8 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp HttpMemoryLogger.txlog(vo.getAdapterGroupName() + vo.getAdapterName(), "SEND [" + sendData + "]" + CommonLib.getDumpMessage(sendData)); } + + TxFileLogger.logTxFile(tempProp, sendData, "[OUT_SEND]"); String uuid = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID); HttpContext context = new BasicHttpContext(); @@ -472,11 +475,14 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp // 여기까지 responseHeaders = response.getHeaders(); + + TxFileLogger.logTxFile(tempProp, new String(responseMessage, vo.getEncode()), "[OUT_RECV]"); if (logger.isDebug()) { logger.debug("[received status]" + status); logger.debug("HttpClientAdapterServiceRest] RECV (" + vo.getAdapterGroupName() + ") = [" + responseMessage + "]"); } + } } catch (ConnectException e) { if (logger.isDebug() && "N".equals(vo.getTestCallYn())) { diff --git a/src/main/java/com/eactive/eai/common/util/TxFileLogger.java b/src/main/java/com/eactive/eai/common/util/TxFileLogger.java new file mode 100644 index 0000000..6e72234 --- /dev/null +++ b/src/main/java/com/eactive/eai/common/util/TxFileLogger.java @@ -0,0 +1,16 @@ +package com.eactive.eai.common.util; + +import java.util.Properties; + +public class TxFileLogger { + + private static Logger siftLogger = Logger.getLogger(Logger.LOGGER_SIFT); + + public static void logTxFile(Properties transactionProp, String message, String prefix) { + if (siftLogger.isInfoEnabled()) { + siftLogger.info(prefix + message); + if (siftLogger.isDebugEnabled()) + siftLogger.debug(CommonLib.getDumpMessage(message)); + } + } +} diff --git a/src/main/java/com/eactive/eai/inbound/processor/RequestProcessor.java b/src/main/java/com/eactive/eai/inbound/processor/RequestProcessor.java index 64b358d..cc696e6 100644 --- a/src/main/java/com/eactive/eai/inbound/processor/RequestProcessor.java +++ b/src/main/java/com/eactive/eai/inbound/processor/RequestProcessor.java @@ -129,8 +129,8 @@ public class RequestProcessor extends RequestProcessorSupport { String testMasterYn = adptGrpVO.getTestMasterYn(); // UUID 생성 : UUID에서 - 없는 32자리 - String uuid = ""; - uuid = UUIDGenerator.getUUID().toString().replaceAll("-", ""); + String uuid = prop.getProperty(TransactionContextKeys.TRANSACTION_UUID); + uuid = uuid == null ? UUIDGenerator.getUUID().toString().replaceAll("-", "") : uuid; // UUID 생성 : UUID = server구분4자리 + UUID /* String uuid = ""; diff --git a/src/main/java/com/eactive/eai/outbound/HTTPProcess.java b/src/main/java/com/eactive/eai/outbound/HTTPProcess.java index b965eca..76192bc 100644 --- a/src/main/java/com/eactive/eai/outbound/HTTPProcess.java +++ b/src/main/java/com/eactive/eai/outbound/HTTPProcess.java @@ -4,11 +4,17 @@ import java.net.SocketTimeoutException; import java.util.Properties; import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.circuitBreaker.CircuitBreakerManager; +import com.eactive.eai.common.circuitBreaker.type.TypedCircuitBreakerManager; import com.eactive.eai.util.PropertiesUtil; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import io.github.resilience4j.circuitbreaker.CircuitBreaker; + import org.apache.commons.lang3.StringUtils; import com.eactive.eai.adapter.AdapterGroupVO; @@ -99,7 +105,32 @@ public class HTTPProcess extends DefaultProcess { this.timeout = iTimeoutValue * 1000; this.tempProp.put(INTERFACE_TIME_OUT, "" + this.timeout); try { - this.resObject = HttpSender.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp); + // API별 이용 + String apiId = reqEaiMsg.getEAISvcCd(); + CircuitBreaker circuitBreaker = TypedCircuitBreakerManager.getInstance().getCircuitBreaker(apiId); + + // 디폴트 이용 + if(circuitBreaker == null) { + String circuitBreakerUseYn = PropManager.getInstance().getProperty("CircuitBreaker", "useYn"); + if ("Y".equals(circuitBreakerUseYn)) + circuitBreaker = CircuitBreakerManager.getInstance().getCircuitBreaker(apiId); + } + + if (circuitBreaker != null) { + // ObjectMapper 인스턴스 생성 + ObjectMapper objectMapper = new ObjectMapper(); + + // 서킷 브레이커의 메트릭 정보와 상태 정보를 직접 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)); + } else { + this.resObject = HttpSender.callService(this.adapterGroupName, this.outboundProp, this.reqObject, this.tempProp); + } // 응답코드에 대한 처리 this.resEaiMsg = setResponseForOutbound(this.resEaiMsg); if (!com.eactive.eai.adapter.Keys.IF_STANDARD.equals(this.adptrMsgPtrnCd)) {