咱們設想一個業務場景,就好比訂單吧,咱們通常的設計都會把訂單狀態存到訂單表裏面,其餘的業務信息也都有表保存,而狀態機的主要做用實際上是規範整個訂單業務流程的狀態和事件,因此狀態機要不要保存真的不重要,咱們只須要從訂單表裏面把狀態取出來,知道當前是什麼狀態,而後伴隨着業務繼續流浪到下一個狀態節點就行了(流浪遠方,流~浪~~)。java
咱們先實現一個StateMachinePersist,由於我不想真的持久化,因此就敷衍一下,持久化是什麼,啥也不幹。git
import org.springframework.statemachine.StateMachineContext; import org.springframework.statemachine.StateMachinePersist; import org.springframework.statemachine.support.DefaultStateMachineContext; import org.springframework.stereotype.Component; @Component public class OrderStateMachinePersist implements StateMachinePersist<OrderStates, OrderEvents, Order> { @Override public void write(StateMachineContext<OrderStates, OrderEvents> context, Order contextObj) throws Exception { //這裏不作任何持久化工做 } @Override public StateMachineContext<OrderStates, OrderEvents> read(Order contextObj) throws Exception { StateMachineContext<OrderStates, OrderEvents> result = new DefaultStateMachineContext<OrderStates, OrderEvents>(OrderStates.valueOf(contextObj.getState()), null, null, null, null, "orderMachine"); return result; } }
而後在PersistConfig裏面轉換成StateMachinePersisterspring
@Configuration public class PersistConfig { @Autowired private OrderStateMachinePersist orderStateMachinePersist; @Bean(name="orderPersister") public StateMachinePersister<OrderStates, OrderEvents, Order> orderPersister() { return new DefaultStateMachinePersister<OrderStates, OrderEvents, Order>(orderStateMachinePersist); } }
如今問題來了,不持久化的持久化類是爲啥呢,主要就是爲了取一個任何狀態節點的狀態機,方便繼續往下執行,請看controllerapp
@RestController @RequestMapping("/statemachine") public class StateMachineController { @Resource(name="orderPersister") private StateMachinePersister<OrderStates, OrderEvents, Order> persister; @RequestMapping("/testOrderRestore") public void testOrderRestore(String id) throws Exception { StateMachine<OrderStates, OrderEvents> stateMachine = orderStateMachineBuilder.build(beanFactory); //訂單 Order order = new Order(); order.setId(id); order.setState(OrderStates.WAITING_FOR_RECEIVE.toString()); //恢復 persister.restore(stateMachine, order); //查看恢復後狀態機的狀態 System.out.println("恢復後的狀態:" + stateMachine.getState().getId()); } }
看到沒有,用builder建了一個新的狀態機,用restore過了一手,就已是一個到達order指定狀態的老司機狀態機了,在這裏,持久化不是本意,讓狀態機可以隨時抓換到任意狀態節點纔是目的。在實際的企業開發中,不可能全部狀況都是從頭至尾的按狀態流程來,會有不少意外,好比歷史數據,故障重啓後的遺留流程......,因此這種能夠任意調節狀態的纔是咱們須要的狀態機。框架
這篇文章內容比較少,因此決定說點廢話,湊點字數。從上面能夠看到,狀態機的自己數據其實沒啥價值,有價值的業務數據好比訂單其實都存庫表,狀態值通常也是伴隨訂單一塊兒保存就好了。那麼狀態機最核心的價值在哪呢?在第一章的時候其實就講過了,spring statemachine框架的做用在於提供一個軟件項目業務切入的視角,咱們的關注點不在於具體的業務數據,而是狀態流程,這個做爲主線,咱們必需要清楚,可是企業開發是很複雜的,狀況叢生,好比咱們一直舉例的流程,都是一條直線的流程:ide
簡單的使人髮指,實際的狀況顯然比這個複雜,會有分支選擇,會有回到上一個狀態的狀況。下一章咱們來弄一個複雜的狀態機流程圖來描述一下,試一下spring statemachine 在企業真實環境下的表現力。ui
源代碼地址spa