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的なものであるため、その状態自体で行動が変化するべきではないためです。

選択状態に入る a でAction定義しようとしましたか?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 に答える