saga json文件阅读

先明确核心目标

我们要找的是:开卡(openCard)执行失败后,怎么触发「补偿 - 注册失败(logoutState)」

第一步:定位「开卡」这个业务节点(正向执行的核心)

先在 JSON 的nodes数组里找到开卡节点,确认它的基本信息:

json

复制代码
{
  "type": "node",
  "label": "开卡",                // 节点名称:开卡
  "stateId": "openCard",          // 节点ID:openCard
  "stateType": "ServiceTask",     // 类型:业务任务(正向执行)
  "id": "d20de769",               // 唯一标识:d20de769(重点记这个ID)
  "stateProps": {
    "ServiceMethod": "openCard"   // 正向执行的方法:openCard()
  }
}

👉 关键信息:开卡节点的唯一 ID 是 d20de769,执行的正向方法是 openCard()

第二步:定位「补偿 - 注册失败」这个补偿节点(要执行的回滚方法)

nodes数组里找「补偿节点」(特征:stateType="Compensation"):

json

复制代码
{
  "type": "node",
  "label": "补偿-注册失败",       // 节点名称:补偿-注册失败
  "stateId": "logoutState",       // 节点ID:logoutState
  "stateType": "Compensation",    // 类型:补偿节点(核心标识)
  "id": "ebae97fa",               // 唯一标识:ebae97fa(重点记)
  "stateProps": {
    "ServiceMethod": "logoutState"// 补偿要执行的方法:logoutState()
  }
}

👉 关键信息:补偿节点 ID 是 ebae97fa,回滚方法是 logoutState()

第三步:找「开卡→补偿 - 注册失败」的绑定关系(JSON 里的 "契约")

edges数组里找「补偿类型连线」(特征:style.type="Compensation"):

json

复制代码
{
  "source": "d20de769",       // 来源:开卡节点的ID(d20de769)
  "target": "ebae97fa",       // 目标:补偿节点的ID(ebae97fa)
  "style": {
    "type": "Compensation",   // 连线类型:补偿(核心)
    "lineDash": "4"           // 虚线(视觉上的补偿连线)
  },
  "id": "7976c7cb"
}

👉 这行配置的意思:开卡节点(d20de769)绑定了补偿节点(ebae97fa),开卡失败就执行这个补偿方法

第四步:找「开卡失败触发补偿」的条件(什么时候执行补偿)

edges数组里找「指向补偿触发器」的连线(补偿触发器 ID:581ec6d9):

1. 先定位补偿触发器节点

json

复制代码
{
  "type": "node",
  "label": "补偿触发器",
  "stateType": "CompensationTrigger",
  "id": "581ec6d9"  // 补偿触发器ID:581ec6d9(重点记)
}
2. 找开卡失败触发补偿的连线

json

复制代码
{
  "source": "f700c1bd",       // 来源:开卡后的「是否成功?」判断节点
  "target": "581ec6d9",       // 目标:补偿触发器(581ec6d9)
  "stateProps": {
    "Expression": "[resp]==false" // 触发条件:开卡返回false
  },
  "label": "fail",            // 标签:失败
  "id": "72cebcc7"
}

👉 这行配置的意思:开卡执行后,「是否成功?」判断节点如果发现返回值是 false,就走到补偿触发器

第五步:完整执行链路(开卡失败→触发补偿)

把上面的配置串起来,就是一个完整的补偿场景:

plaintext

复制代码
1. 正向执行:状态机执行开卡节点(d20de769)→ 调用openCard()方法 → 返回false;
2. 失败判断:走到「是否成功?」节点(f700c1bd)→ 触发条件[resp]==false成立;
3. 触发补偿:从判断节点走到补偿触发器(581ec6d9);
4. 执行补偿:框架根据绑定关系(d20de769→ebae97fa)→ 调用补偿方法logoutState();
5. 补偿结束:执行完补偿后,走到Fail节点(c8c17df3),流程结束。

再举一个「注册抛异常触发补偿」的简化例子(帮你巩固)

1. 注册节点 ID:093de4fc,补偿节点 ID:4ad8f51a(补偿 - 销卡);
2. 绑定连线:

json

复制代码
{
  "source": "093de4fc",       // 注册节点ID
  "target": "4ad8f51a",       // 补偿-销卡ID
  "style": {"type":"Compensation"}
}
3. 异常触发补偿的连线:

json

复制代码
{
  "source": "d526ca8b",       // 注册异常的Catch节点
  "target": "581ec6d9",       // 补偿触发器
  "stateProps": {
    "Exceptions": ["java.lang.Throwable"] // 捕获所有异常
  }
}

👉 逻辑:注册抛异常→Catch 节点捕获→走到补偿触发器→执行补偿 - 销卡(logoutCard ())→ 再执行补偿 - 注册失败(logoutState ())。

总结

看 JSON 里的补偿,核心就是抓 3 个关键 ID 的关联:

  1. 业务节点 ID(比如开卡 d20de769)→ 知道正向执行什么;
  2. 补偿节点 ID(比如 logoutStateebae97fa)→ 知道回滚执行什么;
  3. 补偿触发器 ID(581ec6d9)→ 知道什么条件触发补偿;
  4. 再通过edges里的连线,把这 3 个 ID 串起来,就是完整的补偿逻辑。

简单记:找 Compensation 类型节点(补偿方法)→ 找 Compensation 类型连线(绑定关系)→ 找指向补偿触发器的连线(触发条件)

相关推荐
在西安放羊的牛油果8 小时前
浅谈 import.meta.env 和 process.env 的区别
前端·vue.js·node.js
鹏北海8 小时前
从弹窗变胖到 npm 依赖管理:一次完整的问题排查记录
前端·npm·node.js
布列瑟农的星空8 小时前
js中的using声明
前端
薛定谔的猫28 小时前
Cursor 系列(2):使用心得
前端·ai编程·cursor
全栈独立开发者8 小时前
点餐系统装上了“DeepSeek大脑”:基于 Spring AI + PgVector 的 RAG 落地指南
java·人工智能·spring
用户904706683578 小时前
后端问前端:我的接口请求花了多少秒?为啥那么慢,是你慢还是我慢?
前端
深念Y8 小时前
仿B站项目 前端 4 首页 顶层导航栏
前端·vue·ai编程·导航栏·bilibili·ai开发
dmonstererer8 小时前
【k8s设置污点/容忍】
java·容器·kubernetes
dragonZhang8 小时前
基于 Agent Skills 的 UI 重构实践:从 Demo 到主题化界面的升级之路
前端·ai编程·claude
super_lzb8 小时前
mybatis拦截器ParameterHandler详解
java·数据库·spring boot·spring·mybatis