【问题标题】:Correct way to use substatemachine in spring-statemachine在 spring-statemachine 中使用 substatemachine 的正确方法
【发布时间】:2022-01-21 06:36:48
【问题描述】:

我不确定我是否清楚地了解如何使用子状态。 我没有找到任何正确的弹簧状态机配置的解释示例,所以如果有人可以与我分享,我会很高兴。

在下面的图片中,有我目前正在研究的弹簧机的虚拟表示(实际状态数要大得多)。 从逻辑上讲,内部状态可以分为 3 个父状态:注册、用户配置和管理员配置。

问题 #1。这是子状态的正确用法吗?我可以在没有子状态的情况下编写它,但我觉得它可能而且应该被分组。第二张图片是来自 spring 文档的 SM 图表,它看起来与我自己的 SM 中的非常相似:https://docs.spring.io/spring-statemachine/docs/current/reference/index.html#configuring-hierarchical-states

问题 #2。日志中有一些我无法理解的输出。

这是我的过渡配置的一部分:

.external(TestState.SELECT_TYPE, TestState.CHOICE_SELECT_TYPE, TestEvent.TYPE_SELECTED)
.choice(
    TestState.CHOICE_SELECT_TYPE,
    TestState.EMPLOYEE,
    TestState.SEARCHER,
    registrationStateService::isEmployeeUserTypeSelected
)
.external(
    TestState.ADMIN_ROLE,
    TestState.ADMIN_SMTH,
    TestEvent.ADMIN_ROLE_SELECTED
)
.external(
    TestState.ADMIN_SMTH,
    TestState.ADMIN_SMTH_ELSE,
    TestEvent.ADMIN_SMTH_SELECTED
)

并声明配置:

.and()
.withStates()
.parent(TestState.ADMIN)
.initial(TestState.ADMIN_ROLE)

所以ADMIN是一个父状态,这个子机的初始状态是ADMIN_ROLE。

这是我执行 SM 的日志:

...
State changed from: FILL_SURNAME to SELECT_TYPE by NAME_FILLED
State entered: SELECT_TYPE
State changed from: SELECT_TYPE to CHOICE_SELECT_TYPE by TYPE_SELECTED
State entered: ADMIN
State changed from: null to ADMIN_ROLE by null
State entered: ADMIN_ROLE
State changed from: ADMIN_ROLE to ADMIN_SMTH by ADMIN_ROLE_SELECTED    <-BREAK POINT 1
State entered: ADMIN_SMTH
State changed from: ADMIN_SMTH to ADMIN_SMTH_ELSE by ADMIN_SMTH_SELECTED    <-BREAK POINT 2
State entered: ADMIN_SMTH_ELSE
...

我在将事件发送到状态机之前放置了断点。对于第一个 BP,statemachine.state.id 的结果是 ADMIN - 标记为父状态的状态。但是,在此之前我在日志中看到我们已经进入了 ADMIN_ROLE 状态。好的,我理解为 state.id 是主要 SM 的 currentState。 对于断点 #2,statemachine.state.id 的结果是 ADMIN_SMTH。 所以问题是,为什么在案例 1 中我看到主状态机的状态,而对于案例 2,结果是子机状态?也许我做错了什么?

【问题讨论】:

    标签: spring state-machine spring-statemachine


    【解决方案1】:

    好的,那是因为我放了:

    .states(State.values().toSet())
    

    所以我的子机状态被复制到主机中。这就是为什么转换工作出乎意料的原因。小心这个。

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多