fix: resolve MCI_STRING routing issue and add fast fail timeout for router

This commit is contained in:
jade
2026-07-14 09:56:21 +09:00
parent 06e6bc6f6c
commit 97a054da82
3 changed files with 21 additions and 7 deletions

View File

@@ -50,7 +50,13 @@ public class McpRouterController {
this.securityProperties = securityProperties; this.securityProperties = securityProperties;
this.objectMapper = objectMapper; this.objectMapper = objectMapper;
this.gatewayFallbackProperties = gatewayFallbackProperties; this.gatewayFallbackProperties = gatewayFallbackProperties;
this.restClient = RestClient.create();
// [수정됨] 1초 타임아웃을 강제하여 죽은 서버 대기로 인한 지연 방지
org.springframework.http.client.SimpleClientHttpRequestFactory factory = new org.springframework.http.client.SimpleClientHttpRequestFactory();
factory.setConnectTimeout(1000); // 연결 시도 타임아웃 1초
factory.setReadTimeout(1000); // 응답 대기 타임아웃 1초
this.restClient = RestClient.builder().requestFactory(factory).build();
} }
@Operation(summary = "MCP 파이프라인 호출", description = "MCP 표준 파이프라인(ExecuteService)을 통해 레거시 툴을 호출합니다.") @Operation(summary = "MCP 파이프라인 호출", description = "MCP 표준 파이프라인(ExecuteService)을 통해 레거시 툴을 호출합니다.")

View File

@@ -34,10 +34,14 @@ public abstract class AbstractMcpToolService {
@Autowired @Autowired
protected ObjectMapper objectMapper; protected ObjectMapper objectMapper;
/**
* 레거시 시스템을 호출하고 공통 처리(PII 마스킹 등)를 수행합니다.
*/
protected Map<String, Object> executeLegacy(String routingType, String interfaceId, Object inputData) { protected Map<String, Object> executeLegacy(String routingType, String interfaceId, Object inputData) {
return executeLegacy(routingType, interfaceId, inputData, null);
}
/**
* 레거시 시스템을 호출하고 공통 처리(PII 마스킹 등)를 수행합니다. (스펙 지정 가능)
*/
protected Map<String, Object> executeLegacy(String routingType, String interfaceId, Object inputData, java.util.List<Map<String, Object>> spec) {
Map<String, Object> inputMap; Map<String, Object> inputMap;
if (inputData == null) { if (inputData == null) {
inputMap = new HashMap<>(); inputMap = new HashMap<>();
@@ -58,7 +62,7 @@ public abstract class AbstractMcpToolService {
log.info("=======================================================\n"); log.info("=======================================================\n");
// 1. Adapter 공통 모듈 직접 호출 // 1. Adapter 공통 모듈 직접 호출
String executionResult = legacyEimsConnector.executeByTool(routingType, interfaceId, inputMap, null); String executionResult = legacyEimsConnector.executeByTool(routingType, interfaceId, inputMap, spec);
log.info("\n======================================================="); log.info("\n=======================================================");
log.info(" [Legacy -> Tool] 레거시 시스템 통신 완료"); log.info(" [Legacy -> Tool] 레거시 시스템 통신 완료");

View File

@@ -24,7 +24,7 @@ import java.util.Map;
*/ */
@Service @Service
@McpTool( @McpTool(
routingType = "MCI_STRING", routingType = "MCI",
categoryKey = "common" categoryKey = "common"
) )
public class SampleStringToolService extends AbstractMcpToolService { public class SampleStringToolService extends AbstractMcpToolService {
@@ -36,7 +36,11 @@ public class SampleStringToolService extends AbstractMcpToolService {
) )
public Object execute(SampleStringReq req) { public Object execute(SampleStringReq req) {
// 1. EIMS(Legacy)를 통해 원본 고정 길이 문자열을 받아옵니다. // 1. EIMS(Legacy)를 통해 원본 고정 길이 문자열을 받아옵니다.
Map<String, Object> result = executeLegacy("MCI_STRING", "TRGM_001", req); // 스펙에 mciFormat = STRING 힌트를 주어 전문 통신으로 자동 분기되게 합니다.
java.util.List<Map<String, Object>> spec = java.util.List.of(
Map.of("mciFormat", "STRING")
);
Map<String, Object> result = executeLegacy("MCI", "TRGM_001", req, spec);
if (!"SUCCESS".equals(result.get("status"))) { if (!"SUCCESS".equals(result.get("status"))) {
return result; return result;