0

ステート マシンは、choice ステート内の評価が false を返すと、次のステートに移動するのではなく、choice ステートで一時停止します。

以下のコード:

状態の定義:

@Override
public void configure(StateMachineStateConfigurer<String, String>
states)  throws Exception {
    states
    .withStates()
    .initial("init")
    .choice("S1Choice")
    .state("S1")
    .choice("S2Choice")
    .state("S2")
    .choice("S3Choice")
    .state("S3")
    .state("end");
}

トランジション/選択/アクション:

@Override
public void configure(StateMachineTransitionConfigurer<String, String> transitions) throws Exception {
    transitions
    .withExternal()
    .source("init")
    .target("S1Choice")
    .event("start")
    .and()
    .withChoice()
    .source("S1Choice")
    .first("S1", new Guard<String, String>() {

        public boolean evaluate(StateContext<String, String> context) {
            System.out.println("In s1 choice");
            /*Map<Object, Object> map = context.getExtendedState().getVariables();
            return !map.containsKey("S1done");*/
            return false;
        }
    })
    .last("S2Choice")
    .and()
    .withLocal()
    .source("S1")
    .target("S2Choice")
    .action(new Action<String, String>() {

        public void execute(StateContext<String, String> context) {
            Map<Object, Object> map = context.getExtendedState().getVariables();
            System.out.println("Executing s1");
            map.put("S1done", Boolean.TRUE);
        }
    })
    .and()
    .withChoice()
    .source("S2Choice")
    .first("S2", new Guard<String, String>() {

        public boolean evaluate(StateContext<String, String> context) {
            System.out.println("In s2 choice");
            Map<Object, Object> map = context.getExtendedState().getVariables();
            return !map.containsKey("S2done");
        }
    })
    .last("S3Choice")
    .and()
    .withLocal()
    .source("S2")
    .target("S3Choice")
    .action(new Action<String, String>() {

        public void execute(StateContext<String, String> context) {
            Map<Object, Object> map = context.getExtendedState().getVariables();
            System.out.println("Executing s2");
            map.put("S2done", Boolean.TRUE);
        }
    })
    .and()
    .withChoice()
    .source("S3Choice")
    .first("S3", new Guard<String, String>() {

        public boolean evaluate(StateContext<String, String> context) {
            System.out.println("In s3 choice");
            Map<Object, Object> map = context.getExtendedState().getVariables();
            return !map.containsKey("S3done");
        }
    })
    .last("end")
    .and()
    .withLocal()
    .source("S3")
    .target("end")
    .and()
    .withLocal()
    .source("end")
    .target("init");
}

メインクラス:

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(TasksConfig.class);
    
    StateMachine<String, String> stateMachine = context.getBean(StateMachine.class);
    stateMachine.start();
    stateMachine.getExtendedState().getVariables().put("S1done", Boolean.TRUE);
    
    stateMachine.sendEvent("start");
    //stateMachine.stop();
}

以下は、キャプチャされた出力のサンプルです。

ワークアイテムの状態が init に変更されました

情報: 開始 S2 S1 終了 init S3 S1Choice S3Choice S2Choice / init /

s1選択で

ご覧のとおり、新しい状態「s2 選択」に移行する代わりに、状態「s1 選択」で失速します。

4

1 に答える 1

0

リンクされた疑似状態に問題がある 1.0.x を使用しているようです (回避策は、それらの選択肢の間に通常の状態を置くことです)。これらは 1.1.x で修正されています (1.1.0 は来週リリースされます)。

于 2016-05-18T06:56:07.047 に答える