gpt4 book ai didi

Spring状态机不接受来自多个用户的相同事件

转载 作者:行者123 更新时间:2023-12-05 00:20:54 26 4
gpt4 key购买 nike

我有以下简单的状态机 States , EventsTransitions .

状态:WIP, SUBMITTED, REJECTED, APPROVED
事件:SUBMIT, APPROVE, REJECT
过渡:

@Override
public void configure(StateMachineTransitionConfigurer<States,Events> transitions)
throws Exception {
transitions
.withExternal()
.source(States.WIP)
.target(States.SUBMIT)
.event(Events.SUBMIT)
.and()
.withExternal()
.source(States.SUBMITTED)
.target(States.APPROVED)
.event(Events.APPROVE)
.and()
.withExternal()
.source(States.SUBMITTED)
.target(States.REJECTED)
.event(Events.REJECT);;
}
  • WIP 到 SUBMITTED 提交事件
  • 已提交 APPROVE 事件的批准
  • REJECT 事件提交到 REJECTED

  • 我已经设置了 WIP作为初始状态如下:
    @Override
    public void configure(StateMachineStateConfigurer<States, Events> states)
    throws Exception {
    states
    .withStates()
    .initial(States.WORK_IN_PROGRESS)
    .states(EnumSet.allOf(States.class));
    }

    多个用户将与此状态机交互。当针对源状态和目标状态的组合多次引发同一事件时,状态机仅接受第一个事件,不接受后续事件。

    这是状态机的有效行为吗?如果是,我需要添加任何额外的配置吗?

    最佳答案

    在这样的场景中使用一个状态机实例只有在代理和批准者都处理一组文档时才有效。自然它会为现实世界的用例带来问题,因为只有当审批者将机器恢复到可以提交文档的状态时,代理才能提交新文档。

    因此,您需要为每组提交的文档创建一个专用实例。这可以通过从配置中公开工厂 http://docs.spring.io/spring-statemachine/docs/1.0.0.RELEASE/reference/htmlsingle/#sm-factories 来完成。或手动使用构建器 http://docs.spring.io/spring-statemachine/docs/1.0.0.RELEASE/reference/htmlsingle/#state-machine-via-builder .然后你需要手动控制你正在与哪台机器交谈。

    您提到文档可以在那里等待数天等待某人批准,如果您需要重新启动持有状态机的进程,这会产生问题。 (使用简单的进程内状态机会丢失状态)

    我会推荐一些不同的方法来解决这个问题。检查持久样本 http://docs.spring.io/spring-statemachine/docs/1.0.0.RELEASE/reference/htmlsingle/#statemachine-examples-persist这是一个演示,其中“东西”保存在数据库中,并且使用单个状态机实例通过状态机更新数据库。这允许您将内容保存在持久存储中并处理状态机中的转换逻辑。

    我们目前正在尝试通过尝试实现更好的持久模型并可能通过 spring 安全性和 spring session 引入一些魔法来减轻/保护可以在状态机中执行操作的不同角色,从而使这些使用场景更易于使用。所以请继续关注 future 的版本。

    关于Spring状态机不接受来自多个用户的相同事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33254483/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com