测试的demo在seata-samples/local-saga-sample
回滚的流程 在ReduceBalance抛出异常,然后触发CompensationTrigger,回滚CompensateReduceInventory和CompensateReduceBalance。
这次我们直接从CompensationTrigger的模块开始讲,前面的步骤在上一篇文章已经讲过了。
1.CompensationTriggerStateHandler#process
第一步把 上面蓝色框的ReduceInventory,ReduceBalance工作流程加入栈
第二步设置一个trigger的标记,在第4步用到。
2.ProcessControllerImpl#process
路由到下一步
3.DefaultRouterHandler#route
4.TaskStateRouter#route
在第1步设置了trigger标记,所以这里进入compensateRoute函数。
5.TaskStateRouter#compensateRoute
从第1步的栈取出需要回滚的工作流程,获取compensateState,最后一行instruction设置stateName为 CompensateReduceBalance
6.DefaultRouterHandler#route
7.ServiceTaskStateHandler#process
8.StateInstruction#getState
第84行,根据第5步的设置的stateName获取对应的state。
state的格式如下。
9.ServiceTaskStateHandler#process
获取到serviceName跟methodName,然后反射调用。
10.BalanceActionImpl#compensateReduce
上面步骤执行了CompensateReduceBalance的工作流程,另一个要回滚的CompensateReduceInventory类似。