spring statemachine的企業可用級開發指南7-僞持久化和中間段狀態機

一、僞持久化和中間段的狀態機

    咱們設想一個業務場景,就好比訂單吧,咱們通常的設計都會把訂單狀態存到訂單表裏面,其餘的業務信息也都有表保存,而狀態機的主要做用實際上是規範整個訂單業務流程的狀態和事件,因此狀態機要不要保存真的不重要,咱們只須要從訂單表裏面把狀態取出來,知道當前是什麼狀態,而後伴隨着業務繼續流浪到下一個狀態節點就行了(流浪遠方,流~浪~~)。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

相關文章
相關標籤/搜索