-
Notifications
You must be signed in to change notification settings - Fork 8.8k
steam builder design
wt_better edited this page Dec 21, 2023
·
3 revisions
用户通过状态机构造器StateMachineBuilder进行类似以下的方式进行流式编排即可:
StateMachine builtStateMachine = stateMachineBuilder
.withName("simpleTestStateMachine")
.withComment("测试状态机定义")
.withStartState("FirstState")
.withVersion("0.0.1")
.withStates()
.build(ServiceTaskStateBuilder.class)
.withName("FirstState")
.withServiceName("is.seata.saga.DemoService")
.withServiceMethod("foo")
.withPersist(false)
.withNext("ScriptState")
.and()
.build(ChoiceStateBuilder.class)
.withName("ChoiceState")
.withChoice("foo == 1", "FirstMatchState")
.withChoice("foo == 2", "SecondMatchState")
.withDefault("FailState")
.and()
// ..., A full example can be referred to StateBuilderTests#testBuildStateMachine
.configure()
.build();
从调用链最起始的StateMachineBuilder来拆分架构,StateMachineBuilder专用于构建状态机定义,其接口定义如下:
public interface StateMachineBuilder
{
StateMachine build();
StatesConfigurer withStates();
StateMachineBuilder withName(String name);
// ... more
}
其中build方法构造一个状态机定义StateMachine对象;with* 等方法为设置状态机自身属性;withStates将状态机的状态定义配置交给StatesConfigurer。 StatesConfigurer接口主要提供一个泛型方法state,泛型参数为StateBuilder类型,调用build方法代表着开始了状态的构建,状态构建器的类型通过泛型参数传递给build方法;configure方法旨在返回当前工作的StateMachineBuilder对象。
public interface StatesConfigurer
{
<B extends StateBuilder<?>> B build(Class<B> clazz);
StateMachineBuilder configure();
}
对于StateBuilder,其build方法顾名思义就是构建出一个对应的状态;而and方法旨在返回当前工作的StatesConfigurer对象。
public interface StateBuilder
{
State build();
StatesConfigurer and();
}
目前的 Seata Saga 支持的状态类型共有 8 种,分别为
- ServiceTask:执行调用服务任务
- Choice:单条件选择路由
- CompensationTrigger:触发补偿流程
- Succeed:状态机正常结束
- Fail:状态机异常结束
- SubStateMachine:调用子状态机
- CompensateSubMachine:用于补偿一个子状态机
此外,在任务 3 中还添加了 2 种类型状态:
- Fork:并行执行开始
- Join:并行执行结束
针对每种任务需要分别实现对应的 builder 以提供专有属性的链式构造。