12. State Machine ID
各种类和接口使用machineId作为方法中的变量或参数。 本章将详细介绍machineId如何与正常的状态机操作和实例相关。
在运行时,状态机确实没有任何重要的操作角色,除了将状态机彼此区分开来,例如在跟踪日志或进行更深入的调试时。 如果没有简单的方法来识别这些实例并且设置本机器的选项被赋予给用户,那么拥有大量不同的状态机实例会很快导致用户在转换中丢失。
12.1 使用 @EnableStateMachine
通过JavaConfig将machineId设置为mymachine,然后如上所示将日志公开。 同样的machineId也可以通过StateMachine.getId()方法获得。
@Override
public void configure(StateMachineConfigurationConfigurer<String, String> config)
throws Exception {
config
.withConfiguration()
.machineId("mymachine");
}
11:23:54,509 INFO main support.LifecycleObjectSupport [main] -
started S2 S1 / S1 / uuid=8fe53d34-8c85-49fd-a6ba-773da15fcaf1 / id=mymachine
手动构建器第13.2节“通过构建器的状态机”使用相同的配置接口,意义相同。
12.2 使用 @EnableStateMachineFactory
如果您使用StateMachineFactory并使用id请求新计算机,您将看到相同的machineId配置。
StateMachineFactory<String, String> factory = context.getBean(StateMachineFactory.class);
StateMachine<String, String> machine = factory.getStateMachine("mymachine");
12.3 使用 StateMachineModelFactory
在幕后,首先将所有机器配置转换成StateMachineModel,以便StateMachineFactory不需要知道从何处开始配置,因为可以使用JavaConfig,UML或Repository构建机器。 如果用户想要发疯,也可以使用自定义的StateMachineModel,这将是定义配置的最低级别。
这些都与machineId有关? StateMachineModelFactory还具有StateMachineModelFactory实现可以选择使用的方法StateMachineModel <S,E> build(String machineId)。
RepositoryStateMachineModelFactory第34章,Repository Support使用machineId来支持通过Spring Data Repository接口使用的持久存储中的不同配置。 例如,StateRepository和TransitionRepository都有一个方法List <T> findByMachineId(String machineId),以便通过machineId构建不同的状态和转换。 使用RepositoryStateMachineModelFactory(如果machineId用作空或NULL)缺省情况下存储库配置(在备用持久模型中),而不使用已知的机器标识。
UmlStateMachineModelFactory当前不区分不同的机器ID,因为uml源始终来自同一个文件。 以为这可能会在未来的版本中发生变化。