状态机弹簧

时间:2019-05-31 10:36:26

标签: spring kotlin spring-statemachine

我需要创建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回调?

1 个答案:

答案 0 :(得分:0)

  

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

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

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

  

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

在某些时候,“更新操作”需要转换为“更新事件”。 根据您的需求,这里有很多选择:

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

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

  

如何收听此操作的onSuccess回调?

请参阅StateMachineListener作为起点,并查看此answer