【问题标题】:Need help for building state machine config需要帮助来构建状态机配置
【发布时间】:2016-05-19 07:36:58
【问题描述】:

我正在尝试为附加的状态图构建配置。 问题是我无法将入口操作注册到分叉内区域中的状态。 即对于状态 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 和 task 4 step0 应该在并行区域 task1 和 task2 完成执行时完成。 step1 应该在并行区域 task3 和 task4 完成执行时完成。 实际上task1,task2,task3,task4这四个状态都应该并行执行

如果 step0 和 step2 完成,则 S1 完成。

只有在完成所有并行状态后才会发生从 S1 到 S2 的转换 即 (step0(task1 & task 2) and step2 (task3 and task4))

另外请注意,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)之后发生。

【问题讨论】:

  • 在我进一步查看之前,您是否尝试在父级别使用.initial("S41").state("S41",null,null) 或可能的.state("S41",null,null)S41 定义操作?下周正式发布的 1.1.x 也做了很多修复。
  • 谢谢!它奏效了。
  • 我已经更新了问题。感谢任何帮助

标签: spring-statemachine


【解决方案1】:

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

我将其推送到 github ssm-example1。状态图有什么你想在这里追逐的吗?

当您运行它时,您会获得状态条目的顺序,并且连接应该处理该流程是synchronized。要在S1S2 之间执行某些操作,在中间添加其他状态并在那里执行操作可能更容易。能够从 JOIN(s) 向传出顶点添加操作可能很方便,但我不确定它是否合法并且可能不适用于当前的 ssm 版本(1.1.0.RELEASE)。

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

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

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

【讨论】:

  • 感谢您对示例的快速回复。我们正在尝试使用 builder 构建配置,通过读取状态名称、来自外部数据源的转换。所以你能帮我使用 StateMachineBuilder 获得相同的 ssm-sample1 配置吗?(即不使用 uml 或纸莎草纸)。
  • 如果可能的话,还可以将分支转换到具有多个区域的所有父状态
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2011-10-31
  • 2016-08-28
相关资源
最近更新 更多