需要帮助来构建状态机配置

时间:2016-05-19 07:36:59

标签: spring-statemachine

我正在尝试为附加的State diagram状态图构建配置。 问题是我无法在fork内的区域中向状态注册入口操作。 即对于状态S41,S41E,S42,S42E。

配置如下所示。

Builder builder = StateMachineBuilder.builder();

    builder.configureConfiguration()
    .withConfiguration()
        .autoStartup(false).listener(listener()).taskExecutor(taskExecutor());

 builder.configureStates().withStates().initial("S1", ActionFactory.getAction("S1EntryAction"))
    .fork("FORK_STATE")
    .join("JOIN_STATE")
    .state("S4")
    .state("S2", ActionFactory.getAction("S2EntryAction"), null)
    .state("S3", ActionFactory.getAction("S3EntryAction"), null)
    .state("S5", ActionFactory.getAction("S5EntryAction"), null)
    .state("S6", ActionFactory.getAction("S6EntryAction"), null)
    .state("S7", ActionFactory.getAction("S7EntryAction"), null)
    .and().withStates().parent("S4").initial("S41").end("S41E")
    .and().withStates().parent("S4").initial("S42").end("S42E");

    builder.configureTransitions()
        .withExternal().source("S1").target("S2")
        .and().withExternal().source("S2").target("S3")
        .and().withExternal().source("S3").target("FORK_STATE")
        .and().withFork().source("FORK_STATE").target("S4")
        .and().withExternal().source("S41").target("S41E")
        .and().withExternal().source("S42").target("S42E")
        .and().withJoin().source("S4").target("JOIN_STATE")
        .and().withExternal().source("JOIN_STATE").target("S5")
        .and().withExternal().source("S5").target("S6")
        .and().withExternal().source("S6").target("S7");

return builder.build(); 

还有一个帮助。 在上面的状态机配置中,每个状态都有嵌套的状态机。

S1有step0和step1。两者都是正交的 step0具有状态task1和task 2 step1具有状态task3和task4 当并行区域task1和task2完成其执行时,应该完成step0。 当并行区域task3和task4完成其执行时,应该完成step1。 事实上,所有四个状态task1,task2,task3,task4都应该并行执行

如果步骤0和步骤2完成,则S1完成。

仅在完成所有并行状态后才会发生从S1到S2的转换 即(步骤0(任务1和任务2)和步骤2(任务3和任务4))

另请注意,S1是我配置的初始状态。

我已经更新了状态配置,如下所示

.and().withStates().parent("S1")
            .initial("Step0")
                .and().withStates().parent("Step0")
                    .initial("task1", dummyAction1())
                .and().withStates().parent("Step0")
                    .initial("task2", dummyAction2())

.and().withStates().parent("S1")
            .initial("Step1")
                .and().withStates().parent("Step1")
                    .initial("task3", dummyAction3())
                .and().withStates().parent("Step1")
                    .initial("task4", dummyAction4())

.and().withStates().parent("S2")
            .initial("Step01")
                .and().withStates().parent("Step01")
                    .initial("task5", dummyAction3())
                .and().withStates().parent("Step01")

                    .initial("task6", dummyAction4())

.and().withStates().parent("S2")
            .initial("Step11")
                .and().withStates().parent("Step11")
                    .initial("task7", dummyAction3())
                .and().withStates().parent("Step11")
                    .initial("task8", dummyAction4())

如何配置从S1到S2的转换? (S1是初始状态,S1到S2应该在完成S1中的所有并行任务(即task1,task2,task3,task4)之后发生。

1 个答案:

答案 0 :(得分:0)

当你修改它时,你的问题有点乱,但我很快就用uml测试了一些东西(因为它可以更容易,更快速地制作一些东西)。

我将其推入github ssm-example1。状态图是否有你想在这里追逐的东西?

当你运行它时,你得到状态委托和联接的顺序应该处理该流程是synchronized。要在S1S2之间执行某些操作,可能更容易在中间添加其他状态并在其中执行。可以方便地将动作添加到来自JOIN的传出顶点,但是我不确定它是否合法并且可能不适用于当前的ssm版本(1.1.0.RELEASE)。 / p>

我需要尝试使用异步执行程序的行为,因为ssm默认为同步执行程序。它尝试使用连接(不应该在侦听器中获取回调,这是我需要修复的错误)。

如果没有明确的分支(受控条目),理论上,状态委托将回退到默认条目逻辑。

我还没有添加任何操作,但这些操作将是正常的状态进入/退出操作。在将操作与.initial()相关联的示例中,它不是正常的状态条目。使用initial()的操作基本上是一个初始转换操作,它使用默认条目逻辑执行(如果直接进入非初始状态,理论上不会执行)。