mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 16:53:04 +08:00
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:
@@ -49,8 +49,9 @@ public class ActionCore extends PartnerCore<ActionCore> {
|
|||||||
|
|
||||||
private final Lock cacheLock = new ReentrantLock();
|
private final Lock cacheLock = new ReentrantLock();
|
||||||
|
|
||||||
|
// 由于当前的执行器逻辑实现,平台线程池大小不得小于 2,这里规定为最小为 4
|
||||||
private final ExecutorService platformExecutor = Executors
|
private final ExecutorService platformExecutor = Executors
|
||||||
.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
|
.newFixedThreadPool(Math.max(Runtime.getRuntime().availableProcessors(), 4));
|
||||||
private final ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
|
private final ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package work.slhaf.partner.module.modules.action.dispatcher.executor;
|
package work.slhaf.partner.module.modules.action.dispatcher.executor;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.junit.jupiter.api.*;
|
import org.junit.jupiter.api.*;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.mockito.InjectMocks;
|
import org.mockito.InjectMocks;
|
||||||
@@ -44,6 +45,7 @@ import static org.mockito.Mockito.*;
|
|||||||
* 18) 同 stage 多 metaAction 并发完成顺序不固定(未覆盖:更适合集成/压测)
|
* 18) 同 stage 多 metaAction 并发完成顺序不固定(未覆盖:更适合集成/压测)
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
|
@Slf4j
|
||||||
@ExtendWith(MockitoExtension.class)
|
@ExtendWith(MockitoExtension.class)
|
||||||
class ActionExecutorTest {
|
class ActionExecutorTest {
|
||||||
|
|
||||||
@@ -130,8 +132,9 @@ class ActionExecutorTest {
|
|||||||
// 场景4:B1 -> B3 -> B4(两轮) -> B7(成功) -> B10。目的:验证多阶段顺序执行。
|
// 场景4:B1 -> B3 -> B4(两轮) -> B7(成功) -> B10。目的:验证多阶段顺序执行。
|
||||||
@Test
|
@Test
|
||||||
void execute_multiStage_success() {
|
void execute_multiStage_success() {
|
||||||
ExecutorService directExecutor = new DirectExecutorService();
|
ExecutorService platformExecutor = Executors.newFixedThreadPool(4);
|
||||||
stubExecutors(directExecutor, directExecutor);
|
ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
|
||||||
|
stubExecutors(platformExecutor, virtualExecutor);
|
||||||
|
|
||||||
Map<Integer, List<MetaAction>> chain = new HashMap<>();
|
Map<Integer, List<MetaAction>> chain = new HashMap<>();
|
||||||
chain.put(0, List.of(buildMetaAction("a1", false)));
|
chain.put(0, List.of(buildMetaAction("a1", false)));
|
||||||
@@ -145,14 +148,15 @@ class ActionExecutorTest {
|
|||||||
doAnswer(inv -> {
|
doAnswer(inv -> {
|
||||||
MetaAction metaAction = inv.getArgument(0);
|
MetaAction metaAction = inv.getArgument(0);
|
||||||
metaAction.getResult().setStatus(MetaAction.ResultStatus.SUCCESS);
|
metaAction.getResult().setStatus(MetaAction.ResultStatus.SUCCESS);
|
||||||
|
log.info("metaAction result:{}", metaAction.getResult().getStatus());
|
||||||
return null;
|
return null;
|
||||||
}).when(runnerClient).submit(any(MetaAction.class));
|
}).when(runnerClient).submit(any(MetaAction.class));
|
||||||
|
|
||||||
actionExecutor.init();
|
actionExecutor.init();
|
||||||
actionExecutor.execute(input);
|
actionExecutor.execute(input);
|
||||||
|
|
||||||
verify(runnerClient, times(2)).submit(any(MetaAction.class));
|
verify(runnerClient, timeout(5000).times(2)).submit(any(MetaAction.class));
|
||||||
verify(actionCorrector, times(2)).execute(any());
|
verify(actionCorrector, timeout(5000).times(2)).execute(any());
|
||||||
assertEquals(2, actionData.getHistory().size());
|
assertEquals(2, actionData.getHistory().size());
|
||||||
assertEquals(ActionData.ActionStatus.SUCCESS, actionData.getStatus());
|
assertEquals(ActionData.ActionStatus.SUCCESS, actionData.getStatus());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user