一个简单的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;}

squirrel-foundation-demo相关推荐

  1. linux IRQ Management(六)- DTS及调试

    了解DTS Interrupt 设置方式. 1.DTS 中 interrupt 描述 interrupt-controller - 一个空的属性定义, 该节点作为一个接收中断信号的设备. #inter ...

  2. squirrel(松鼠)状态机的介绍及使用

    squirrel(松鼠)状态机 依赖 <dependency><groupId>org.squirrelframework</groupId><artifac ...

  3. iOS开发实战-时光记账Demo 本地数据库版

    现在记账APP也是用途比较广泛 自己写了个简单的demo 欢迎指正 效果 分析 1.思维推导 首先简单的做了下思维推导 2.文件结构 大致框架想好后就可以着手开始准备了 数据库管理:coreData ...

  4. WWF(Windows Workflow Foundation)开发环境的建立。 .NET 技术前瞻,WWF,Windows,Workflow,Foundation...

    1.安装WindowsSDK for Vista,有1.14G之巨,可以从MS的网站上下载,不过需要验证WINDOWS,可以去讯雷区用WindowsSDK为关键字搜索下载. 2.安装Virsul St ...

  5. java struts2 demo,Struts2第一个Demo求指导

    Struts2第一个Demo求指点 本人初学Struts2,按照书上的示例自己写了一个Demo.配置文件及路径如下: login.jsp: pageEncoding="UTF-8" ...

  6. struts2+spring3.2简单demo

    1> jar包. 2>src下的包与类. 3>WebRoot下的文件. 4>这个demo是简单实现了利用session机制存储跟拿取用户输入的内容,完成验证. 其中Contex ...

  7. 转: java web demo的示例

    http://quqtalk.iteye.com/blog/360699 从事Java开发已经两年了,但是由于工作的关系,对Java Web还是个freshman.今天做了一个Java Web的简单D ...

  8. https://en.wikipedia.org/wiki/Linux Foundation

    https://en.wikipedia.org/wiki/Linux_Foundationhttps://en.wikipedia.org/wiki/Linux_Foundation 目录 Goal ...

  9. laravel5.6 邮件队列database驱动简单demo

    一: 邮件初始参数配置 配置 .env  (demo示例是163邮箱,开启POP3和SMTP服务,获取授权密码) MAIL_DRIVER=smtp MAIL_HOST=smtp.163.com MAI ...

  10. Kafka 安装与部署(单机版)与kafkaDemo调试测试(包含JAVA Demo)

    部署需要的包: http://download.csdn.net/download/liangmaoxuan/10228805 1. kafka_2.10-0.10.2.0.tar 1.解压kafka ...

最新文章

  1. python中callable什么意思_Python中callable的理解?
  2. python调研报告总结体会_学习调研心得体会
  3. 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
  4. 【原创】erlang 模块之 epmd
  5. P4309-[TJOI2013]最长上升子序列【Splay】
  6. Linux_linux常用工具---闲杂篇(除了vim, 还有哪些常用的牛逼的编辑器, 并能够横向对比编辑器之间的区别和优缺点.)
  7. 计算机的80端口被占用 - 思路篇
  8. U3D脚本开发基础(转载)
  9. 怎么样判断页面是否在iframe框架里
  10. 一个学习Python的好链接
  11. Description Resource Path Location Type Cannot change version of project fac(导入maven项目出现红叉问题)...
  12. [707]Apache NiFi安装及简单使用
  13. uboot的常用环境变量(bootdelay、ipaddr、serverip、gatewayip、netmask、ethaddr、bootcmd、bootargs)
  14. 直接法-穷举、递推和迭代
  15. 网页无法打开, 位于 https://xxx 的网页无法加载,因为:net::ERR_NAME_NOT_RESOLVED
  16. iphone竖屏视频旋转_在Linux上从iPhone旋转视频
  17. Realme GT 大师版 ROOT 解锁BL教程
  18. 赢在产业新时代,汽车之家如何实现长期价值?
  19. c语言判断字符是否为回车,c语言EFO。。。是怎么判断的。。读到回车结束还是什么...
  20. Centos8网口聚合

热门文章

  1. 为什么打不开_发票查重百科导出的发票台账为什么附件打不开?
  2. 山体等高线怎么看_每日一题 | 此处向斜山,你看出来了吗?
  3. 异步日志系统设计demo
  4. LeetCode 98. 验证二叉搜索树 思考分析
  5. python求和_Python程序查找特殊求和系列的解决方案
  6. c语言打印数组元素_C程序打印元素差为0或1的子集数
  7. 实训09.10:HTML简单表格设计
  8. ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“
  9. UVA 10895——Matrix Transpose
  10. C语言的atoi和C++的to_string