Skip to content

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 以提供专有属性的链式构造。

Clone this wiki locally