From 97627391380141521f6fd061151684ed49474433 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Fri, 19 Dec 2025 23:30:27 +0800 Subject: [PATCH] refactor(action): replace HashMap with ConcurrentHashMap for thread-safe MetaAction storage --- .../java/work/slhaf/partner/core/action/ActionCore.java | 3 ++- .../partner/core/action/runner/LocalRunnerClient.java | 3 ++- .../slhaf/partner/core/action/runner/RunnerClient.java | 9 ++++----- .../partner/core/action/runner/SandboxRunnerClient.java | 4 ++-- Partner-Main/src/test/java/experimental/SystemTest.java | 5 ++--- .../core/action/runner/LocalRunnerClientTest.java | 3 ++- .../partner/core/action/runner/RunnerClientTest.java | 3 ++- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java index ae348e24..9b6397db 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java @@ -17,6 +17,7 @@ import work.slhaf.partner.core.action.runner.SandboxRunnerClient; import java.io.IOException; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Phaser; @@ -53,7 +54,7 @@ public class ActionCore extends PartnerCore { /** * 已存在的行动程序,键格式为‘::’,值为 MCP Server 通过 Resources 相关渠道传递的行动程序元信息 */ - private final Map existedMetaActions = new HashMap<>(); + private final ConcurrentHashMap existedMetaActions = new ConcurrentHashMap<>(); private final List phaserRecords = new ArrayList<>(); private RunnerClient runnerClient; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java index 64dc6936..669d5aa1 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicInteger; @@ -35,7 +36,7 @@ import static work.slhaf.partner.common.Constant.Path.TMP_ACTION_DIR_LOCAL; @Slf4j public class LocalRunnerClient extends RunnerClient { - public LocalRunnerClient(Map existedMetaActions, ExecutorService executor, @Nullable String actionWatchPath) { + public LocalRunnerClient(ConcurrentHashMap existedMetaActions, ExecutorService executor, @Nullable String actionWatchPath) { super(existedMetaActions, executor); ActionWatchService watchService = new ActionWatchService(actionWatchPath); watchService.launch(); diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/RunnerClient.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/RunnerClient.java index 942e12aa..019c104c 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/RunnerClient.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/RunnerClient.java @@ -33,6 +33,7 @@ import java.time.Duration; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @@ -41,7 +42,7 @@ import java.util.function.Function; @Slf4j public abstract class RunnerClient { - protected final Map existedMetaActions; + protected final ConcurrentHashMap existedMetaActions; protected final ExecutorService executor; protected final Map mcpClients = new HashMap<>(); protected final Map localMcpServers = new HashMap<>(); @@ -49,7 +50,7 @@ public abstract class RunnerClient { /** * ActionCore 将注入虚拟线程池 */ - public RunnerClient(Map existedMetaActions, ExecutorService executor) { + public RunnerClient(ConcurrentHashMap existedMetaActions, ExecutorService executor) { this.existedMetaActions = existedMetaActions; this.executor = executor; setupShutdownHook(); @@ -99,9 +100,7 @@ public abstract class RunnerClient { for (McpSchema.Tool tool : tools) { MetaActionInfo info = buildMetaActionInfo(tool); String actionKey = id + "::" + tool.name(); - synchronized (existedMetaActions) { - existedMetaActions.put(actionKey, info); - } + existedMetaActions.put(actionKey, info); } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/SandboxRunnerClient.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/SandboxRunnerClient.java index de1e7715..f7233749 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/SandboxRunnerClient.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/SandboxRunnerClient.java @@ -6,7 +6,7 @@ import work.slhaf.partner.core.action.entity.MetaAction; import work.slhaf.partner.core.action.entity.MetaActionInfo; import java.io.IOException; -import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; /** @@ -25,7 +25,7 @@ import java.util.concurrent.ExecutorService; */ public class SandboxRunnerClient extends RunnerClient { - public SandboxRunnerClient(Map existedMetaActions, ExecutorService executor) { // 连接沙盒执行器(websocket) + public SandboxRunnerClient(ConcurrentHashMap existedMetaActions, ExecutorService executor) { // 连接沙盒执行器(websocket) super(existedMetaActions, executor); } diff --git a/Partner-Main/src/test/java/experimental/SystemTest.java b/Partner-Main/src/test/java/experimental/SystemTest.java index 86982bd2..8306b481 100644 --- a/Partner-Main/src/test/java/experimental/SystemTest.java +++ b/Partner-Main/src/test/java/experimental/SystemTest.java @@ -7,8 +7,7 @@ import work.slhaf.partner.core.action.runner.LocalRunnerClient; import work.slhaf.partner.core.action.runner.RunnerClient; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -39,7 +38,7 @@ public class SystemTest { @Test void localRunnerClientTest() { - Map existedMetaActions = new HashMap<>(); + ConcurrentHashMap existedMetaActions = new ConcurrentHashMap<>(); ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor(); RunnerClient client = new LocalRunnerClient(existedMetaActions, executor, null); JSONObject res = client.listSysDependencies(); diff --git a/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java b/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java index ddf76f54..2fca8a02 100644 --- a/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java +++ b/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java @@ -7,6 +7,7 @@ import work.slhaf.partner.core.action.entity.MetaAction; import work.slhaf.partner.core.action.entity.MetaActionType; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; public class LocalRunnerClientTest { @@ -15,7 +16,7 @@ public class LocalRunnerClientTest { @BeforeAll static void beforeAll() { - runnerClient = new LocalRunnerClient(Map.of(), Executors.newVirtualThreadPerTaskExecutor(), "/home/slhaf/Projects/IdeaProjects/Projects/Partner/Partner-Main/src/test/java/resources/action/data"); + runnerClient = new LocalRunnerClient(new ConcurrentHashMap<>(), Executors.newVirtualThreadPerTaskExecutor(), "/home/slhaf/Projects/IdeaProjects/Projects/Partner/Partner-Main/src/test/java/resources/action/data"); } @Test diff --git a/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/RunnerClientTest.java b/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/RunnerClientTest.java index 5eef9f03..8605d547 100644 --- a/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/RunnerClientTest.java +++ b/Partner-Main/src/test/java/work/slhaf/partner/core/action/runner/RunnerClientTest.java @@ -15,6 +15,7 @@ import work.slhaf.partner.core.action.entity.MetaActionInfo; import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; public class RunnerClientTest { @@ -92,7 +93,7 @@ public class RunnerClientTest { private static class TestRunnerClient extends RunnerClient { public TestRunnerClient() { - super(Map.of(), Executors.newVirtualThreadPerTaskExecutor()); + super(new ConcurrentHashMap<>(), Executors.newVirtualThreadPerTaskExecutor()); } @Override