2015-10-21 123 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

相關問題