3

添加到选择伪状态的操作似乎被默默地忽略了。这样做:

Builder builder = StateMachineBuilder.builder();
StateConfigurer states = builder.configureStates().withStates();
StateMachineTransitionConfigurer transitions = builder.configureTransitions();
StateConfigurer statesConfig = states.initial(INITIAL).states(EnumSet.allOf(StateType.class));
statesConfig.choice(StateType.CHOICE_STATE);

transitions.withChoice().source(StateType.CHOICE_STATE). //
    first(StateType.S1, someGuard). //
    last(StateType.S2);

states.state(StateType.CHOICE_STATE, someAction, null);

当输入 CHOICE_STATE 时,导致 someAction 永远不会被执行。

框架根本不允许将操作添加到 CHOICE_STATE 之外的转换(例如,到上面的 S1 或 S2)。

为了解决这个问题,我们实现了 CHOICE_STATE 之前的状态。然后我们可以像往常一样自由地向这个状态添加动作。我只是想知道这种限制的原因是什么,或者是否有某种方法可以将操作置于我可能错过的伪状态。

4

1 回答 1

4

那是因为选择pseudostate应该是暂时的,因此该状态本身不应该有行为改变。

您是否尝试过Action用 a来定义Transition将您带入选择状态?

@Override
public void configure(StateMachineTransitionConfigurer<TestStates, TestEvents> transitions) throws Exception {
  transitions
    .withExternal()
      .source(TestStates.S1)
      .target(TestStates.S2)
      .event(TestEvents.E2)
      .action(externalTestAction());
}


@Bean
public Action<TestStates, TestEvents> externalTestAction() {
  return new TestAction();
}

前置状态是一个很好的解决方法,尤其是它伴随着无触发转换

我可以尝试在 Spring Statemachine 中查看是否可以将功能添加到转换(用于选择转换的配置器)本身。我为此https://github.com/spring-projects/spring-statemachine/issues/108创建了一张票。

虽然我们主要尝试遵循UML模型,但规范在大多数部分都非常模糊,并且将许多实现细节留给了实现本身。

于 2015-09-10T07:35:47.053 回答