【问题标题】:State machine spring状态机弹簧
【发布时间】:2019-05-31 10:36:26
【问题描述】:

我需要创建 StateMachine 来管理任务。我知道如何创建状态机,但我不能使用它。这是我的第一个状态机,也是第一个 MongoDB 项目。

我的状态机:

@Configuration
@EnableStateMachine
class QuestStateMachineConfig : EnumStateMachineConfigurerAdapter<QuestState, QuestEvent>() {

    @Throws(Exception::class)
    override fun configure(states: StateMachineStateConfigurer<QuestState, QuestEvent>) {
        states.withStates()
                .initial(QuestState.AWAITING)

                .state(QuestState.ASSIGNED)
                .state(QuestState.MARKED_TO_REJECT)
                .state(QuestState.IN_PROGRESS)

                .end(QuestState.DONE)
                .end(QuestState.REJECTED)
    }

@Throws(Exception::class)
override fun configure(transitions: StateMachineTransitionConfigurer<QuestState, QuestEvent>) {
    transitions.withExternal()
            .source(QuestState.AWAITING).target(QuestState.ASSIGNED).event(QuestEvent.ASSIGN)
            .and()
            ...
   }

我需要创建一个状态为 AWAITING 的任务,接下来我必须在用户使用更新操作时对其进行修改并将其保存在数据库中。怎么做?以及如何监听这个操作的 onSuccess 回调?

【问题讨论】:

    标签: spring kotlin spring-statemachine


    【解决方案1】:

    我需要创建一个状态为 AWAITING 的任务

    这通常应该是在数据库中创建的实体。 您可能希望使用状态机管理此实体的状态。

    要获取 SM 的实例,您只需注入它 - 因为@EnableStateMachine,您已经定义了一个实例 - 在启动您的应用程序时,将创建一个 SM,您可以将它注入到您需要的地方。

    "当用户使用更新时,我必须修改并保存在数据库中 行动。怎么办?”

    在某些时候,“更新操作”需要转换为“更新事件”。 这里有很多选择,具体取决于您的需要:

    • 以正常方式更新数据库中的任务(例如存储库),然后将 SM 中的状态令牌移动到正确的状态,以用于该用户的任务(您需要一些方法来关联用户、任务和 SM实例)。

    • 在“更新操作”时 - 向 SM 发送事件,让 SM 更新数据库中的任务并转换到新状态。这可以使用“actions”来实现,或者使用 SM“listener”监听特定事件并对其做出反应。

    如何监听该操作的 onSuccess 回调?

    起点见StateMachineListener,另请查看answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2021-01-28
      相关资源
      最近更新 更多