泛型状态机触发器通过statetrigger解耦状态、事件与业务动作,以map驱动合法转换,支持事务、幂等、补偿及强制重入,适用于金融订单等高一致性场景。

用泛型类设计轻量级状态机触发器,核心在于把「状态类型」「事件类型」「业务动作」三者解耦,同时保留编译期类型安全和运行时可扩展性。它不依赖 Spring Statemachine 的整套配置体系,适合金融订单这类对状态合法性、转换路径、幂等性要求极高的场景。
泛型触发器的核心结构
定义一个泛型抽象类 StateTrigger,其中:
-
S 是状态枚举(如
LoanOrderState),必须实现Comparable和Enum -
E 是事件枚举(如
RepaymentEvent),用于标识触发动作的语义 -
C 是上下文类型(如
RepaymentContext),携带订单 ID、用户信息、资金方参数等运行时数据
该类不负责状态存储,只做「校验 + 路由 + 执行」:收到一个事件和上下文后,先查当前状态是否允许该事件触发,再根据 (S, E) 查找注册的动作处理器,最后调用并返回新状态。
响应式金融公司HTML5网站模板是一款适合提供家族财富管理、节税互助基金、保险投资、节税投资、财务策划和在线投资计划等服务的金融公司宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
状态转换规则用 Map 驱动,不写死 if-else
避免硬编码分支,用不可变映射集中管理合法转换:
- 声明
Map<pair e>, Function<c s>> transitionRules</c></pair>,键是(当前状态,事件)组合,值是执行后返回的新状态 - 初始化时批量注册,例如:
rules.put(Pair.of(NEW, APPLY), ctx -> { saveApplication(ctx); return SUBMITTED; });rules.put(Pair.of(SUBMITTED, APPROVE), ctx -> { callRiskEngine(ctx); return APPROVED; }); - 每次触发前,用
transitionRules.get(Pair.of(currentState, event))查找处理器;查不到即为非法转换,直接抛IllegalStateException
动作处理器支持事务与补偿,适配金融强一致性
每个 Function<c s></c> 不只是状态变更,而是封装完整业务单元:
- 内部可调用
@Transactional方法完成本地 DB 更新 - 对外部系统(如支付网关、资方接口)调用失败时,返回
RETRYING或FAILED等中间态,并记录失败原因到上下文 - 提供
rollback(C)默认方法,供上层在流程中断时手动回滚(比如已扣款但未更新订单状态,需调退款接口) - 所有动作默认具备幂等键(如
ctx.orderId + ":" + event.name()),由触发器统一校验是否已执行过
运行时动态重入,支撑异常修复与人工干预
金融流程常需“跳转到某状态重新执行”——比如资方回调失败后,运营人员手动触发 RETRY_SHIP 事件,从 SHIPPED_WAITING_CONFIRM 状态重走确认逻辑:
- 触发器暴露
forceTransition(C, S, E)方法,绕过前置状态校验,仅检查目标状态是否在预设终态集合中(如COMPLETED,CANCELLED) - 配合数据库里的
last_event和version字段,确保重入不会覆盖更高版本的状态变更 - 每次成功转换自动发布
StateChangeEvent<s></s>事件,供监听器做审计、通知、异步补偿










