squirrel-foundation-demo

一個簡單的squirrel-foundation-demo
利用狀態機模擬一個訂單的支付過程。
squirrel-foundation沒有任何嚴重的依賴關系,因此基本上它應該是高度可嵌入的。squirrel-foundation沒有整合spring框架,所以首先要用spring集成squirrel-foundation。
spring集成squirrel-foundation
(1).通過Spring創建StateMachineBuilder實例(單例);

(2).業務函數中通過(1)的StateMachineBuilder實例創建StateMachine實例,并向StateMachine暴露SpringApplicationContext,以便于StateMachine通過ApplicationContext獲取數據層的對象。

public class AbstractStateMachineEngine <T extends UntypedStateMachine> implements ApplicationContextAware {private ApplicationContext applicationContext;protected UntypedStateMachineBuilder stateMachineBuilder = null;@SuppressWarnings("unchecked")public AbstractStateMachineEngine() {//識別泛型參數Class<T> genericType = (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(),AbstractStateMachineEngine.class);stateMachineBuilder = StateMachineBuilderFactory.create(genericType, ApplicationContext.class);}//注入applicationContext,并在創建StateMachine實例時注入@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public void fire(OrderEvent event, OrderContext context) {T stateMachine = stateMachineBuilder.newUntypedStateMachine(context.orderDTO.getState(),//暫時開啟debug進行日志traceStateMachineConfiguration.create().enableDebugMode(true).enableAutoStart(true),//注入applicationContextapplicationContext);stateMachine.fire(event, context);}
}
  • ?

繼承AbstractStateMachineEngine,并加入@Service注解,便可以在項目中注入。(單例)

@Service
public class OrderStateMachineEngine extends AbstractStateMachineEngine<SubmitOrderStateMachine>{}
  • ?

基于注解的方式定義狀態機
@States 定義狀態列表,里面可以包含多個狀態
@State定義每個狀態,name狀態名稱,entryStateInit進入狀態時調用的方法,exitCallMethod 離開狀態是調用的方法,initialState 為true時,為默認狀態。

@States({@State(name = "INIT", entryCallMethod = "entryStateInit", exitCallMethod = "exitStateInit", initialState = true),@State(name = "WAIT_PAY", entryCallMethod = "entryStateWaitPay", exitCallMethod = "exitStateWaitPay"),@State(name = "WAIT_SEND", entryCallMethod = "entryStateWaitSend", exitCallMethod = "exitStateWaitSend"),@State(name = "PART_SEND", entryCallMethod = "entryStatePartSend", exitCallMethod = "exitStatePartSend"),@State(name = "WAIT_RECEIVE", entryCallMethod = "entryStateWaitReceive", exitCallMethod = "exitStateWaitReceive"),@State(name = "COMPLETE", entryCallMethod = "entryStateComplete", exitCallMethod = "exitStateComplete")
})
@Transitions({@Transit(from = "INIT", to = "WAIT_PAY", on = "SUBMIT_ORDER", callMethod = "submitOrder"),@Transit(from = "WAIT_PAY", to = "WAIT_SEND", on = "PAY", callMethod = "pay"),@Transit(from = "WAIT_SEND", to = "PART_SEND", on = "PART_SEND", callMethod = "partSend"),@Transit(from = "PART_SEND", to = "WAIT_RECEIVE", on = "SEND", callMethod = "send"),@Transit(from = "WAIT_RECEIVE", to = "COMPLETE", on = "COMPLETE", callMethod = "complete")
})
@StateMachineParameters(stateType = OrderState.class, eventType = OrderEvent.class, contextType = OrderContext.class)
public class SubmitOrderStateMachine extends AbstractStateMachine<UntypedStateMachine, Object, Object, Object> implements UntypedStateMachine {private OrderService orderService;protected ApplicationContext applicationContext;//定義構造函數接受ApplicationContext注入([參看New State Machine Instance](http://hekailiang.github.io/squirrel/))public SubmitOrderStateMachine(ApplicationContext applicationContext) {this.applicationContext = applicationContext;// 通過applicationContext注入orderServiceorderService = (OrderService) this.applicationContext.getBean(OrderService.class);}public void submitOrder(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {orderService.submitOrder(toState);}public void pay(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("pay");}public void partSend(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("partSend");}public void send(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("send");}public void complete(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("complete");}public void entryStateInit(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("entryStateInit");}public void exitStateInit(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("exitStateInit");}public void entryStateWaitPay(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("entryStateWaitPay");}public void exitStateWaitPay(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("exitStateWaitPay");}public void entryStateWaitSend(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("entryStateWaitSend");}public void exitStateWaitSend(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("exitStateWaitSend");}public void entryStatePartSend(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("entryStatePartSend");}public void exitStatePartSend(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("exitStatePartSend");}public void entryStateWaitReceive(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("entryStateWaitReceive");}public void exitStateWaitReceive(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("exitStateWaitReceive");}public void entryStateComplete(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("entryStateComplete");}public void exitStateComplete(OrderState fromState, OrderState toState, OrderEvent orderEvent, OrderContext orderContext) {System.out.println("exitStateComplete");}}
  • ?

Service的實現,更新訂單狀態

@Service
public class OrderService {@AutowiredOrderDTOMapper orderDTOMapper;public int submitOrder(OrderState state) {OrderDTO orderDTO = new OrderDTO();orderDTO.setState(state);orderDTOMapper.insert(orderDTO);return 1;}}
  • ?

mapper


@Mapper
public interface OrderDTOMapper {int insert(OrderDTO orderDTO);}
  • ?

Controller類測試
注入OrderStateMachineEngine ,初始化狀態為INIT,通過OrderStateMachineEngine 觸發SUBMIT_ORDER事件,發生狀態變化,并將轉換后的狀態插入數據庫。

@RestController
@RequestMapping(value = "/order/")
public class OrderController {// 注入狀態機@AutowiredOrderStateMachineEngine orderStateMachineEngine;@RequestMapping("/test")public void test(){OrderDTO orderDTO = new OrderDTO(OrderState.INIT);OrderContext orderContext = new OrderContext(orderDTO);orderStateMachineEngine.fire(OrderEvent.SUBMIT_ORDER,orderContext);}}
  • ?

以下是所用到的實體類定義和狀態及事件
訂單的實體

public class OrderDTO {private Integer id;private OrderState state;private Date createTime;private Date updateTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public OrderState getState() {return state;}public void setState(OrderState state) {this.state = state;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getUpdateTime() {return updateTime;}public void setUpdateTime(Date updateTime) {this.updateTime = updateTime;}@Overridepublic String toString() {return "OrderDTO{" +"id=" + id +", state='" + state + '\'' +", createTime=" + createTime +", updateTime=" + updateTime +'}';}public OrderDTO(OrderState state) {this.state = state;}public OrderDTO() {}
}
  • ?

定義訂單的狀態

public enum OrderState {INIT,WAIT_PAY,WAIT_SEND,PART_SEND,WAIT_RECEIVE,COMPLETE,CANCELED;public static OrderState getState(String state) {for (OrderState orderState : OrderState.values()) {if (orderState.name().equalsIgnoreCase(state)) {return orderState;}}return null;}
}
  • ?

定義訂單的事件

public enum OrderEvent {SUBMIT_ORDER,PAY,PART_SEND,SEND,COMPLETE}
  • ?

定義上下文

public class OrderContext {public OrderContext(OrderDTO orderDTO) {this.orderDTO = orderDTO;}public OrderContext() {}public OrderDTO orderDTO;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386569.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB學習目錄

MongoDB基礎篇 MongoDB 之 $ 關鍵字 python操作MongoDB 轉載于:https://www.cnblogs.com/yanzhi-1996/p/11095016.html

講的真透徹!還有人不知道什么是AndroidX的嗎?已拿offer入職

前言 春招已經接近尾聲了&#xff0c;不知道各位小伙伴有沒有收獲自己心儀的offer呢。筆者疫情被裁后在家LeetCode狂刷了800多題&#xff0c;加之自己以為工作總結的知識、經驗&#xff0c;系統化的整理了一下。在五一期間已經收獲了字節的offer。廢話不多說&#xff0c;下面是…

docker 啟動的 jenkins 中調用宿主機docker進行build

前言 期初有這個需求感覺就跟套娃一樣&#xff0c;你在docker 中調用docker&#xff0c;笑哭……這個也太逗了。 不過的確遇到了&#xff0c;因為jenkins 容器中沒有docker &#xff0c;所以在編譯 docker build 的時候 會出現 docker command 不存在。 好吧&#xff0c;解決他…

Codeforces 773D Perishable Roads 最短路 (看題解)

Perishable Roads 智商題&#xff0c; 不會啊。。 貼個官方題解 https://codeforces.com/blog/entry/51883 #include<bits/stdc.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_p…

Rancher中的服務升級實驗

創建一個空的應用myAPP&#xff0c;在myAPP 應用中&#xff0c;創建一個服務nginx-test&#xff0c;包含2個容器副本&#xff0c;使用nginx:1.13.0鏡像。假設使用一段時期以后&#xff0c;nginx的版本升級到1.13.1了&#xff0c;如何將該服務的鏡像版本升級到新的版本&#xff…

該如何高效實用Kotlin?看這一篇就夠了!

前言 說起程序員人們的第一印象就是工資高、加班兇、話少錢多頭發少。再加上現在科技互聯網公司太吃香&#xff0c;bat、華為小米等公司程序員加班情況被廣泛傳播&#xff0c;程序員用生命在敲代碼的印象刻在了很多人的心里。 與其它行業一樣&#xff0c;凡是有高級和普通&…

apply()與call()

JavaScript中的每一個Function對象都有一個apply()方法和一個call()方法&#xff0c;它們的語法分別為&#xff1a; /*apply()方法*/ function.apply(thisObj[, argArray])/*call()方法*/ function.call(thisObj[, arg1[, arg2[, [,...argN]]]]); 它們各自的定義&#xff1a; a…

Java基于redis實現分布式鎖(SpringBoot)

前言 分布式鎖&#xff0c;其實原理是就是多臺機器&#xff0c;去爭搶一個資源&#xff0c;誰爭搶成功&#xff0c;那么誰就持有了這把鎖&#xff0c;然后去執行后續的業務邏輯&#xff0c;執行完畢后&#xff0c;把鎖釋放掉。 可以通過多種途徑實現分布式鎖&#xff0c;例如…

請談下Android消息機制,復習指南

談起Android框架體系架構&#xff0c;我先提個問&#xff1a;什么是Android框架體系架構 &#xff1f; Android系統構架是安卓系統的體系結構&#xff0c;android的系統架構和其操作系統一樣&#xff0c;采用了分層的架構&#xff0c;共分為四層&#xff0c;從高到低分別是And…

SVN Cannot merge into a working copy that has local modifications

我嘗試了 主支&#xff0c;分支都提交&#xff0c;但是依然無法合并。 最終&#xff0c;我在服務器上將分支刪除&#xff0c;然后主支在拷貝過去。 一&#xff0c;打開服務器資源 二&#xff0c;刪除分支 三&#xff0c;拷貝主支到分支 四&#xff0c;刷新分支&#xff0c;就能…

資深Android開發帶你入門Framework,再不刷題就晚了!

想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣。 本文參考了目前大部分 Android 應用啟動優化的方案&#xff0c;將大家的方案做一個匯總&#xff0c;如果你有這方面的需求&#xff0c;只…

K8S相關內容

常用工具&#xff1a;docker linux k8s kubeadm 概念 etcd 數據庫 類似redis api server 接口對外提供api 調用 可以命令 kubectl 或者 kube-proxy&#xff0c;能訪問etcd&#xff0c;事件總線 scheduler 調度決策的組件 掌握新的情況&#xff0c;進行決策及分布pod放在哪些n…

資深Android開發帶你入門Framework,架構師必備技能

開頭 先說一下我大概的情況吧。渣本畢業&#xff0c;工作已經有快兩年了&#xff0c;從高中就開始玩小破站。無論是學習還是日常放松都是在b站。大學主學的軟件技術專業&#xff0c;所以&#xff0c;進大學校門那一刻起&#xff0c;去上海bilibili工作就在心里埋下了種子。在學…

Java——線程鎖,死鎖,等待喚醒機制

一、線程鎖 線程安全問題 其實&#xff0c;線程安全問題都是由全局變量及靜態變量引起的。若每個線程中對全局變量、靜態變量只有讀操作&#xff0c;而無寫操作&#xff0c;一般來說&#xff0c;這個全局變量是線程安全的&#xff1b;若有多個線程同時執行寫操作&#xff0c;…

資深大牛帶你了解源碼!關于Android程序員最近的狀況,大廠內部資料

前言 回顧一下自己這段時間的經歷&#xff0c;因公司突然通知裁員&#xff0c;我匆匆忙忙地出去面了幾家&#xff0c;但最終都沒有拿到offer&#xff0c;我感覺今年的寒冬有點冷。公司開始第二波裁員&#xff0c;我決定主動拿賠償走人。后續的面試過程我做了一些準備&#xff…

AE 新建項目(一)(持續更新,做到哪算哪)

開發環境 工具&#xff1a;Visual Studio 2012、ArcEngine10.4.1 語言&#xff1a;C# 開發步驟 1、打開Visual Studio 2012&#xff0c;選擇新建項目&#xff0c;創建一個.NET Framework4的&#xff0c;Windows窗體應用程序。取名Demo 2、工具箱中&#xff0c;拖一個splitConta…

基于redis分布式鎖實現的多線程并發程序

前兩個版本的代碼 都或多或少存在一定的問題&#xff0c;雖然可能微乎其微&#xff0c;但是程序需要嚴謹再嚴謹&#xff0c; 第一個版本問題&#xff1a; 局限于單機版&#xff0c;依賴于 Jvm的鎖 第二個版本問題&#xff1a; 極端情況下&#xff0c;解鎖邏輯的問題&#xf…

day15 Ui自動化元素的定位

day15 元素的定位Ui自動化元素的定位1、火狐瀏覽器安裝try xpath2、元素定位思路&#xff1a;&#xff08;1&#xff09;查看頁面元素&#xff0c;確認能夠唯一定位到元素的屬性&#xff0c;比如id&#xff0c;文案3、學習xpath cssSelector 手寫定位方式xpath&#xff08;xpat…

幾張圖可以理解GC JVM調優的內容

public class ApiPurchaseOrderServiceApp {public static void main(String[] args) throws Exception {ApiPurchaseOrderServiceApp mnew ApiPurchaseOrderServiceApp();m.compute();//棧System.out.println("ok");//方法出口}public int compute(){int a1;//局部…

靈魂拷問!一起刷完了這份1307頁的安卓面試寶典吧,不吃透都對不起自己

前言 每個程序員都有一個夢想&#xff0c;那就是進一線互聯網公司深造&#xff0c;不要跟我說你不想進去&#xff0c;如果給你一個這樣的平臺&#xff0c;不管是薪資待遇還是接觸的高度來說&#xff0c;對我們程序員來說都是一個機會&#xff0c;我以前有一個同事&#xff0c;…