From d8b19ebcead36e0c423990d6bc2a6eaeb5f7e629 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Wed, 18 Mar 2026 16:52:52 +0800 Subject: [PATCH] refactor(runner): refactor CommandExecutionService into single instance --- .../partner/core/action/runner/LocalRunnerClient.java | 9 ++------- .../action/runner/execution/CommandExecutionService.java | 7 ++++++- .../action/runner/execution/OriginExecutionService.java | 9 +++------ .../core/action/runner/mcp/DynamicActionMcpManager.java | 5 ++--- .../core/action/runner/LocalRunnerClientTest.java | 2 +- .../runner/execution/CommandExecutionServiceTest.java | 2 +- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java index a6ddfeed..695296f8 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java @@ -9,7 +9,6 @@ import work.slhaf.partner.core.action.entity.ActionFileMetaData; import work.slhaf.partner.core.action.entity.MetaAction; import work.slhaf.partner.core.action.entity.MetaActionInfo; import work.slhaf.partner.core.action.exception.ActionInitFailedException; -import work.slhaf.partner.core.action.runner.execution.CommandExecutionService; import work.slhaf.partner.core.action.runner.execution.McpActionExecutor; import work.slhaf.partner.core.action.runner.execution.OriginExecutionService; import work.slhaf.partner.core.action.runner.mcp.*; @@ -38,7 +37,6 @@ public class LocalRunnerClient extends RunnerClient implements AutoCloseable { private final McpClientRegistry mcpClientRegistry; private final McpTransportFactory mcpTransportFactory; - private final CommandExecutionService commandExecutionService; private final ActionSerializer actionSerializer; private final OriginExecutionService originExecutionService; private final McpActionExecutor mcpActionExecutor; @@ -62,9 +60,8 @@ public class LocalRunnerClient extends RunnerClient implements AutoCloseable { McpClientRegistry clientRegistry = new McpClientRegistry(); McpTransportFactory transportFactory = new McpTransportFactory(); - CommandExecutionService commandService = new CommandExecutionService(); ActionSerializer serializer = new ActionSerializer(tmpActionPath, dynamicActionPath); - OriginExecutionService originService = new OriginExecutionService(commandService); + OriginExecutionService originService = new OriginExecutionService(); McpActionExecutor actionExecutor = new McpActionExecutor(clientRegistry); McpMetaRegistry metaRegistry = null; @@ -86,8 +83,7 @@ public class LocalRunnerClient extends RunnerClient implements AutoCloseable { dynamicManager = new DynamicActionMcpManager( Path.of(dynamicActionPath), existedMetaActions, - executor, - commandService + executor ); registerMcpClient(clientRegistry, transportFactory, MCP_NAME_DYNAMIC, dynamicManager.clientConfig(10)); log.info("DynamicActionMcp 注册完毕"); @@ -114,7 +110,6 @@ public class LocalRunnerClient extends RunnerClient implements AutoCloseable { this.mcpClientRegistry = clientRegistry; this.mcpTransportFactory = transportFactory; - this.commandExecutionService = commandService; this.actionSerializer = serializer; this.originExecutionService = originService; this.mcpActionExecutor = actionExecutor; diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java index d47aee0e..8ecf32d6 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java @@ -13,7 +13,12 @@ import java.util.concurrent.atomic.AtomicInteger; public class CommandExecutionService { - private ExecutorService readerExecutor = Executors.newVirtualThreadPerTaskExecutor(); + public static final CommandExecutionService INSTANCE = new CommandExecutionService(); + + private final ExecutorService readerExecutor = Executors.newVirtualThreadPerTaskExecutor(); + + private CommandExecutionService() { + } public String[] buildFileExecutionCommands(String launcher, Map params, String absolutePath) { int paramSize = params == null ? 0 : params.size(); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/OriginExecutionService.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/OriginExecutionService.java index 31a54088..984c369b 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/OriginExecutionService.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/OriginExecutionService.java @@ -12,21 +12,18 @@ import java.util.List; public class OriginExecutionService { - private final CommandExecutionService commandExecutionService; - - public OriginExecutionService(CommandExecutionService commandExecutionService) { - this.commandExecutionService = commandExecutionService; + public OriginExecutionService() { } public RunnerClient.RunnerResponse run(MetaAction metaAction) { RunnerClient.RunnerResponse response = new RunnerClient.RunnerResponse(); File file = new File(metaAction.getLocation()); - String[] commands = commandExecutionService.buildFileExecutionCommands(metaAction.getLauncher(), metaAction.getParams(), file.getAbsolutePath()); + String[] commands = CommandExecutionService.INSTANCE.buildFileExecutionCommands(metaAction.getLauncher(), metaAction.getParams(), file.getAbsolutePath()); WrappedLaunchSpec wrapped = ExecutionPolicyRegistry.INSTANCE.prepare(Arrays.stream(commands).toList()); List wrappedCommands = new ArrayList<>(); wrappedCommands.add(wrapped.getCommand()); wrappedCommands.addAll(wrapped.getArgs()); - CommandExecutionService.Result execResult = commandExecutionService.exec(wrappedCommands); + CommandExecutionService.Result execResult = CommandExecutionService.INSTANCE.exec(wrappedCommands); response.setOk(execResult.isOk()); response.setData(execResult.getTotal()); return response; diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/mcp/DynamicActionMcpManager.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/mcp/DynamicActionMcpManager.java index 49a6ae3f..a0fc92ea 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/mcp/DynamicActionMcpManager.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/mcp/DynamicActionMcpManager.java @@ -45,11 +45,10 @@ public class DynamicActionMcpManager implements AutoCloseable { public DynamicActionMcpManager(Path root, ConcurrentHashMap existedMetaActions, - ExecutorService executor, - CommandExecutionService commandExecutionService) throws IOException { + ExecutorService executor) throws IOException { this.root = root; this.existedMetaActions = existedMetaActions; - this.commandExecutionService = commandExecutionService; + this.commandExecutionService = CommandExecutionService.INSTANCE; InProcessMcpTransport.Pair pair = InProcessMcpTransport.pair(); this.clientTransport = pair.clientSide(); McpSchema.ServerCapabilities serverCapabilities = McpSchema.ServerCapabilities.builder() diff --git a/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java b/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java index e0380c7d..9b379b87 100644 --- a/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java +++ b/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/LocalRunnerClientTest.java @@ -890,7 +890,7 @@ public class LocalRunnerClientTest { LocalRunnerClient client = new LocalRunnerClient(existedMetaActions, executor, tempDir.toString()); BuiltinActionRegistry registry = new BuiltinActionRegistry(); client.setBuiltinActionRegistry(registry); - registry.defineBuiltinAction("echo", buildMetaActionInfo("echo"), params -> params.get("value")); + registry.defineBuiltinAction("echo", buildMetaActionInfo("echo"), params -> params.get("value").toString()); try { MetaAction metaAction = buildMetaAction(MetaAction.Type.BUILTIN, "builtin", "echo", Map.of("value", "ok")); diff --git a/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionServiceTest.java b/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionServiceTest.java index 86f028fd..3e4f1eb0 100644 --- a/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionServiceTest.java +++ b/Partner-Core/src/test/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionServiceTest.java @@ -12,7 +12,7 @@ import java.util.Map; class CommandExecutionServiceTest { - private final CommandExecutionService service = new CommandExecutionService(); + private final CommandExecutionService service = CommandExecutionService.INSTANCE; @Test void testBuildFileExecutionCommandsWithOrderedParams() {