refactor(ActionCore): Specifies the minimum platform thread pool size

Context:
 The ActionExecutor needs at least 2 platform thread to support async  action execution,
 otherwise the current ActionExecutor logic cannot be executed
This commit is contained in:
2026-02-05 16:49:58 +08:00
parent 76da3c29f8
commit 08bda84471
2 changed files with 10 additions and 5 deletions

View File

@@ -49,8 +49,9 @@ public class ActionCore extends PartnerCore<ActionCore> {
private final Lock cacheLock = new ReentrantLock();
// 由于当前的执行器逻辑实现,平台线程池大小不得小于 2这里规定为最小为 4
private final ExecutorService platformExecutor = Executors
.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
.newFixedThreadPool(Math.max(Runtime.getRuntime().availableProcessors(), 4));
private final ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
/**

View File

@@ -1,5 +1,6 @@
package work.slhaf.partner.module.modules.action.dispatcher.executor;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
@@ -44,6 +45,7 @@ import static org.mockito.Mockito.*;
* 18) 同 stage 多 metaAction 并发完成顺序不固定(未覆盖:更适合集成/压测)
*/
@SuppressWarnings("unused")
@Slf4j
@ExtendWith(MockitoExtension.class)
class ActionExecutorTest {
@@ -130,8 +132,9 @@ class ActionExecutorTest {
// 场景4B1 -> B3 -> B4(两轮) -> B7(成功) -> B10。目的验证多阶段顺序执行。
@Test
void execute_multiStage_success() {
ExecutorService directExecutor = new DirectExecutorService();
stubExecutors(directExecutor, directExecutor);
ExecutorService platformExecutor = Executors.newFixedThreadPool(4);
ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
stubExecutors(platformExecutor, virtualExecutor);
Map<Integer, List<MetaAction>> chain = new HashMap<>();
chain.put(0, List.of(buildMetaAction("a1", false)));
@@ -145,14 +148,15 @@ class ActionExecutorTest {
doAnswer(inv -> {
MetaAction metaAction = inv.getArgument(0);
metaAction.getResult().setStatus(MetaAction.ResultStatus.SUCCESS);
log.info("metaAction result:{}", metaAction.getResult().getStatus());
return null;
}).when(runnerClient).submit(any(MetaAction.class));
actionExecutor.init();
actionExecutor.execute(input);
verify(runnerClient, times(2)).submit(any(MetaAction.class));
verify(actionCorrector, times(2)).execute(any());
verify(runnerClient, timeout(5000).times(2)).submit(any(MetaAction.class));
verify(actionCorrector, timeout(5000).times(2)).execute(any());
assertEquals(2, actionData.getHistory().size());
assertEquals(ActionData.ActionStatus.SUCCESS, actionData.getStatus());
}