2015-10-21 180 views
4

我有简单的状态机,下面的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);; 
} 
  1. WIP对提交submit事件
  2. 提交获准用于APPROVE事件
  3. 提交REJECTED对于REJ ECT事件

我已经设置WIP为如下的初始状态:

@Override 
public void configure(StateMachineStateConfigurer<States, Events> states) 
      throws Exception { 
    states 
    .withStates() 
     .initial(States.WORK_IN_PROGRESS) 
     .states(EnumSet.allOf(States.class)); 
} 

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

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

+0

是否期待每个用户都拥有自己的状态机实例?如果你只有一个实例,那么你的行为是预期的。即您可以公开状态机工厂并从那里获取新实例或手动使用构建器类。如果您描述您的用例,我可以提供更多说明。 –

+0

简而言之,用例是代理和审批者两个角色。代理商提交的文件很少,批准者可以批准或拒绝。这是一个Web应用程序,并且会有多个代理和审批者。代理商提交文档后,批准者可能需要几天才能批准或拒绝。那么在这种情况下,每个提交应该有一个状态机器? – Mithun

回答

5

在这种情况下使用一个状态机实例只有在代理和批准者都处理一组文档时才有效。当然,它会给真实世界的用例带来问题,因为代理人只能在审批者将机器恢复为可提交文档的位置时才能提交新文档。

因此,您需要为每组提交的文档提供一个专用实例。这可以通过从配置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这是一个演示,其中“stuff”保存在数据库中,并且单个状态机实例用于通过状态机更新db。这使您可以将您的东西保存在持久存储中并处理状态机内的转换逻辑。

我们正试图通过尝试实现更好的持久模型来使这些使用场景更易于使用,并且可能通过弹簧安全和弹簧会话来引入一些魔法,以缓解/保护可以在状态机中执行操作的不同角色。敬请关注未来版本。

+0

谢谢你的详细解答。 :) – Mithun

相关问题