设为首页 加入收藏

TOP

状态机的介绍和使用(四)
2023-08-06 07:49:48 】 浏览:90
Tags:
ext> builder = StateMachineBuilderFactory.create(); // 接单后,运输需求单生成运输规划单 builder.externalTransition() .from(None) .to(UN_ASSIGN_CARRIER) .on(Create_Event) .when(checkCondition()) .perform(doAction()); // 运输规划单生成调度单,调度单绑定服务商 builder.externalTransition() .from(UN_ASSIGN_CARRIER) .to(UN_ASSIGN_CAR) .on(Assign_Carrier_Event) .when(checkCondition()) .perform(doAction()); // 服务商分配车辆、司机 builder.externalTransition() .from(UN_ASSIGN_CAR) .to(ASSIGNED_CAR) .on(Assign_Car_Event) .when(checkCondition()) .perform(doAction()); // 货物揽收 builder.externalTransition() .from(ASSIGNED_CAR) .to(PICKUPED) .on(Trans_Job_Status_Change_Event) .when(checkCondition()) .perform(doAction()); // 揽收货物更新到运输中 builder.externalTransition() .from(ASSIGNED_CAR) .to(IN_TRANSIT) .on(Trans_Job_Status_Change_Event) .when(checkCondition()) .perform(doAction()); // 运输中更新到过海关 builder.externalTransition() .from(IN_TRANSIT) .to(PASS_CUSTOMS) .on(Trans_Job_Status_Change_Event) // 检查是否需要过海关 .when(isTransNeedPassCustoms()) .perform(doAction()); // 妥投 builder.externalTransition() .from(PASS_CUSTOMS) .to(ALL_DELIVERIED) .on(All_Delivery_Event) .when(checkCondition()) .perform(doAction()); // 车辆揽收、运输、过海关的运输状态,都可以直接更新到妥投 Stream.of(PICKUPED, IN_TRANSIT, PASS_CUSTOMS) .forEach(status -> builder.externalTransition() .from(status) .to(ALL_DELIVERIED) .on(Trans_Job_Status_Change_Event) .when(checkCondition()) .perform(doAction()) ); // 待分配、待派车、已派车可取消 Stream.of(UN_ASSIGN_CARRIER, UN_ASSIGN_CAR, ASSIGNED_CAR) .forEach(status -> builder.externalTransition() .from(status) .to(CANCELED) .on(Order_Cancel_Event) .when(checkCondition()) .perform(doAction()) ); // 妥投、和取消可结束归档 Stream.of(ALL_DELIVERIED, CANCELED) .forEach(status -> builder.externalTransition() .from(status) .to(FINISH) .on(Order_Finish) .when(checkCondition()) .perform(doAction()) ); stateMachine = builder.build("TransNeedStatusMachine");

从代码中,可以方便的扩展状态和对应的事件,状态机自动进行业务状态的流转。生成的状态流转图如下所示:

@startuml
None --> UN_ASSIGN_CARRIER : Create_Event
UN_ASSIGN_CARRIER --> UN_ASSIGN_CAR : Assign_Carrier_Event
UN_ASSIGN_CAR --> ASSIGNED_CAR : Assign_Car_Event
ASSIGNED_CAR --> CANCELED : Order_Cancel_Event
ASSIGNED_CAR --> PICKUPED : Trans_Job_Status_Change_Event
ASSIGNED_CAR --> IN_TRANSIT : Trans_Job_Status_Change_Event
IN_TRANSIT --> PASS_CUSTOMS : Trans_Job_Status_Change_Event
PASS_CUSTOMS --> ALL_DELIVERIED : Trans_Job_Status_Change_Event
PASS_CUSTOMS --> ALL_DELIVERIED : All_Delivery_Event
IN_TRANSIT --> ALL_DELIVERIED : Trans_Job_Status_Change_Event
ALL_DELIVERIED --> FINISH : Order_Finis
UN_ASSIGN_CAR --> CANCELED : Order_Cancel_Event
UN_ASSIGN_CARRIER --> CANCELED : Order_Cancel_Event
PICKUPED --> ALL_DELIVERIED : Trans_Job_Status_Change_Event
CANCELED --> FINISH : Order_Finis
@enduml





4.2.2 状态机事件处理

/**
 * 一种是通过Event来进行事件分发,不同Event通过EventBus走不同的事件响应
* 另一种是在构造状态机时,直接配置不同的Action
 * @return
 */
private Action<TransNeedStatusEnum, TransNeedEventEnum, Context> doAction() {
    log.info("do action");
    return (from, to, event, ctx) -> {
        log.info(ctx.getUserName(
首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇注意!JAVA中的值传递 下一篇Sprint Boot学习路线2

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目