【发布时间】:2023-01-13 01:22:38
【问题描述】:
我的状态机有问题。重新运行我的服务后,恢复的状态机缺少 StateMachineInterceptor,这是我在第一次创建状态机实例时添加的。
拦截器对我来说很重要,因为每次转换后都会进行一些后处理,而监听器看起来不适合它(我需要在默认方法中使用 stateMachineInstance)
所有相关代码位于下方:
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<S,E>{
@Override
public void configure(StateMachineConfigurationConfigurer<S, E> config) throws Exception {
config
.withPersistence()
.runtimePersister(stateMachinePersister);
config
.withConfiguration()
.autoStartup(false)
.listener(listener);
}
状态机服务配置:
@Configuration
@RequiredArgsConstructor
public class StateMachineServiceConfig {
private final StateMachineFactory<S, E> factory;
private final StateMachineRuntimePersister<S, E, String> stateMachinePersister;
@Bean
public StateMachineService<S, E> stateMachineService() {
return new DefaultStateMachineService<>(factory, stateMachinePersister);
}
}
我的坚持者:
@Configuration
public class StateMachinePersistenceConfiguration {
@Bean
public StateMachineRuntimePersister<S, E, String> stateMachinePersister(
final JpaStateMachineRepository jpaStateMachineRepository) {
return new JpaPersistingStateMachineInterceptor<>(jpaStateMachineRepository);
}
}
我也有点困惑,因为它只使用 state_machine 表,其他表只创建一次,没有任何变化。
用于创建和恢复状态机的类:
@Service
@RequiredArgsConstructor
@Slf4j
public class RelocationRequestsSSMService {
private final StateMachineService<S, E> stateMachineService;
private final MyInterceptor stateMachineInterceptor;
public StateMachine<S, E> createStateMachine() {
StateMachine<S, E> stateMachine = stateMachineService.acquireStateMachine(UUID.randomUuid());
stateMachine.getStateMachineAccessor().withRegion().addStateMachineInterceptor(stateMachineInterceptor);
log.debug("Created ssm with id: " + stateMachine.getId());
return stateMachine;
}
private StateMachine<S, E> getStateMachineBySsmId(String ssmId) {
log.debug("Request ssm from persister with id: " + ssmId);
StateMachine<S, E> stateMachine = stateMachineService.acquireStateMachine(ssmId);
log.debug("Get ssm from persister with id and uuid: " + stateMachine.getId() + " " + stateMachine.getUuid());
return stateMachine;
}
也许 persister 错误地保存了 statemachine 实例,所以如果我配置错误,请帮忙
提前致谢!
【问题讨论】: