0

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

如果 step0 和 step2 完成,则 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 中的所有并行任务(即任务 1、任务 2、任务 3、任务 4)之后发生。

4

1 回答 1

0

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

我把它推到了 github ssm-example1中。状态图有什么你想在这里追逐的吗?

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

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

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

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

于 2016-05-24T20:15:58.970 回答