gpt4 book ai didi

java - 多线程环境下的Spring状态机

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:57 25 4
gpt4 key购买 nike

我有一个带有 n 个消息监听器的事件队列。当一条消息到达时,一个消息监听器接收它并执行状态机的一个新实例。我面临的问题是,虽然多条消息是并行处理的,但状态机开始顺序执行操作,尽管它们是由不同的状态机实例调用的,如您在此处所见:

2017-10-18 16:11:03.740  INFO 30282 --- [lTaskExecutor-1] o.s.s.support.LifecycleObjectSupport     : started org.springframework.statemachine.support.DefaultStateMachineExecutor@6ddb1ea6
2017-10-18 16:11:03.741 INFO 30282 --- [lTaskExecutor-1] o.s.s.support.LifecycleObjectSupport : started EVALUATE_IS_WALKTHROUGH SAVE END START / START / uuid=b922b6b1-a441-4924-8531-d45e0e0c9c40 / id=null
2017-10-18 16:11:03.740 INFO 30282 --- [TaskExecutor-10] o.s.s.support.LifecycleObjectSupport : started org.springframework.statemachine.support.DefaultStateMachineExecutor@13b6ace4
2017-10-18 16:11:03.741 INFO 30282 --- [TaskExecutor-10] o.s.s.support.LifecycleObjectSupport : started EVALUATE_IS_WALKTHROUGH SAVE END START / START / uuid=e06a8c1d-beed-41c6-bc63-d8c1a3a56169 / id=null
2017-10-18 16:11:03.759 INFO 30282 --- [pool-5-thread-1] i.b.b.e.processors.actions.SaveAction : [io.botbit.backend.events.processors.actions.SaveAction@607e4071] Saving event Event[id=null,
2017-10-18 16:11:24.046 INFO 30282 --- [pool-5-thread-1] i.b.b.e.processors.actions.SaveAction : [io.botbit.backend.events.processors.actions.SaveAction@607e4071] Saving event Event[id=null,
2017-10-18 16:11:44.058 INFO 30282 --- [pool-5-thread-1] i.b.b.e.p.a.EvaluateIsWalkthroughAction : Evaluation is WT,,,
2017-10-18 16:11:44.059 INFO 30282 --- [pool-5-thread-1] o.s.s.support.LifecycleObjectSupport : stopped org.springframework.statemachine.support.DefaultStateMachineExecutor@6ddb1ea6
2017-10-18 16:11:44.060 INFO 30282 --- [pool-5-thread-1] o.s.s.support.LifecycleObjectSupport : stopped EVALUATE_IS_WALKTHROUGH SAVE END START / / uuid=b922b6b1-a441-4924-8531-d45e0e0c9c40 / id=null
2017-10-18 16:11:44.060 INFO 30282 --- [pool-5-thread-1] i.b.b.e.p.a.EvaluateIsWalkthroughAction : Evaluation is WT,,,
2017-10-18 16:11:44.061 INFO 30282 --- [pool-5-thread-1] o.s.s.support.LifecycleObjectSupport : stopped org.springframework.statemachine.support.DefaultStateMachineExecutor@13b6ace4
2017-10-18 16:11:44.061 INFO 30282 --- [pool-5-thread-1] o.s.s.support.LifecycleObjectSupport : stopped EVALUATE_IS_WALKTHROUGH SAVE END START / / uuid=e06a8c1d-beed-41c6-bc63-d8c1a3a56169 / id=nul

我认为发生这种情况是因为每个操作都在同一个线程 ([pool-5-thread-1]) 中运行。我需要每个实例都完全并行运行,我的意思是状态机是并行执行的,而且它的 Action 也是并行执行的。

任何帮助将不胜感激,谢谢!

@Component
public class EventConsumer {
private final static Logger logger = Logger.getLogger(EventConsumer.class);
@Autowired
private StateMachineFactory<String, String> eventProcessorFactory;

public void consume(Event event) {
logger.info("Received <" + event + ">");
StateMachine<String, String> eventProcessor = eventProcessorFactory.getStateMachine();
eventProcessor.getExtendedState().getVariables().put("event", event);
eventProcessor.start();
eventProcessor.sendEvent(CommonEvents.SUCCESS);
}

public void consume(Collection<Event> events) {
for (Event event : events) {
this.consume(event);
}
}
}

这是状态机配置

@Configuration
@EnableStateMachineFactory
public class WiFiConnectEventProcessorConfig extends StateMachineConfigurerAdapter<String, String> {

@Autowired
SaveAction saveAction;
@Autowired
DeprecateAddVisitationAction addVisitation;
@Autowired
EvaluateIsWalkthroughAction isWTAction;

@Override
public void configure(StateMachineStateConfigurer<String, String> states) throws Exception {
states.withStates().initial(WiFiConnectStates.START).state(WiFiConnectStates.SAVE, saveAction)
.state(WiFiConnectStates.DEPRECATE_ADD_VISITATION, addVisitation)
.state(WiFiConnectStates.EVALUATE_IS_WALKTHROUGH, isWTAction).end(WiFiConnectStates.END);
}

@Override
public void configure(StateMachineTransitionConfigurer<String, String> transitions) throws Exception {
transitions.withExternal().source(WiFiConnectStates.START).target(WiFiConnectStates.SAVE)
.event(CommonEvents.SUCCESS)
.and().withExternal().source(WiFiConnectStates.SAVE)
.target(WiFiConnectStates.DEPRECATE_ADD_VISITATION).event(CommonEvents.SUCCESS)
.and().withExternal()
.source(WiFiConnectStates.DEPRECATE_ADD_VISITATION).target(WiFiConnectStates.EVALUATE_IS_WALKTHROUGH)
.event(CommonEvents.SUCCESS)
.and().withExternal().source(WiFiConnectStates.EVALUATE_IS_WALKTHROUGH)
.target(WiFiConnectStates.END).event(CommonEvents.SUCCESS);
}
}

最佳答案

您需要创建自己的 TaskScheduler,并在您的 StateMachineConfig @Configuration 文件中按如下方式配置它。根据您的需要选择合适的 PoolSize。

    @Override
public void configure(StateMachineConfigurationConfigurer<TaskState, TaskEvent> config) throws Exception {
config.withConfiguration()
.taskScheduler(myTaskScheduler());
}

@Bean
public TaskScheduler myTaskScheduler() {
final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
return scheduler;
}

关于java - 多线程环境下的Spring状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46819899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com