diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java index 10a3fcb9..1e79f37a 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java @@ -234,9 +234,11 @@ public class ToolRegistryHeartbeatSender { public void registerAllTools() { if (registeredTools.isEmpty()) return; - for (ToolMetadata tool : registeredTools) { - registerTool(tool); - } + new Thread(() -> { + for (ToolMetadata tool : registeredTools) { + registerTool(tool); + } + }, "McpToolRegistrationThread").start(); } @PreDestroy @@ -259,17 +261,31 @@ public class ToolRegistryHeartbeatSender { } private void registerTool(ToolMetadata tool) { - try { - restClient.post() - .uri(gatewayUrl + "/mcp/api/v1/registry/register") - .header("Content-Type", "application/json") - - .body(tool) - .retrieve() - .toBodilessEntity(); - log.info(" [HeartbeatSender] 툴 재등록 성공: {}", tool.getUid()); - } catch (Exception ex) { - log.error(" [HeartbeatSender] 툴 등록 실패: {}", ex.getMessage()); + int maxRetries = 12; + int delayMs = 10000; + for (int i = 0; i < maxRetries; i++) { + try { + restClient.post() + .uri(gatewayUrl + "/mcp/api/v1/registry/register") + .header("Content-Type", "application/json") + .body(tool) + .retrieve() + .toBodilessEntity(); + log.info(" [HeartbeatSender] 툴 등록 성공: {}", tool.getUid()); + return; + } catch (Exception ex) { + if (i == maxRetries - 1) { + log.error(" [HeartbeatSender] 툴 등록 최종 실패 ({}회 재시도): {}", maxRetries, ex.getMessage()); + } else { + log.warn(" [HeartbeatSender] 툴 등록 실패, {}초 후 재시도... ({}/{}): {}", delayMs/1000, i+1, maxRetries, ex.getMessage()); + try { + Thread.sleep(delayMs); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + break; + } + } + } } } }