跳到内容

Execution Starter

受众:开发者 摘要:钩子、管道、责任链共享的执行上下文底座,提供 ExecutionContextDefaultExecutionContextExecutionKey<T> 和中止状态。

spring-open-starter-execution 是钩子 / 管道 / 责任链的共同地基。它只提供进程内同步执行模型需要的上下文和类型安全属性,不直接表达“方法增强”“步骤编排”或“规则链传递”。

何时需要关注

场景建议
在钩子 / 管道 / 责任链之间传递 traceId、属性和中止状态使用 Execution
只想写方法外层增强钩子
需要把主流程拆成固定步骤管道
需要规则自己决定是否继续传递责任链

业务代码通常不需要单独引入 Execution;引入 Hook、Pipeline 或 Chain 时会自然获得它。只有需要自定义上下文、公共 ExecutionKey<T> 或组合三者时,才直接阅读本文。

依赖

xml
<dependency>
    <groupId>com.springopen</groupId>
    <artifactId>spring-open-starter-execution</artifactId>
</dependency>

Java 包名:

text
com.springopen.starter.execution

核心类型

类型说明
ExecutionContext共享上下文接口,承载 traceId、attributes 和中止状态
DefaultExecutionContext默认上下文实现,可直接用于简单组合场景
ExecutionKey<T>类型安全属性 key,避免跨步骤传参时到处手写字符串和强转
ExecutionTermination中止快照,记录中止原因和触发点

快速示例

java
public final class OrderExecutionKeys {
    public static final ExecutionKey<CreateOrderCommand> COMMAND =
            ExecutionKey.of("order.command", CreateOrderCommand.class);

    public static final ExecutionKey<BigDecimal> PAY_AMOUNT =
            ExecutionKey.of("order.pay-amount", BigDecimal.class);

    private OrderExecutionKeys() {
    }
}
java
DefaultExecutionContext context = new DefaultExecutionContext("trace-001");
context.set(OrderExecutionKeys.COMMAND, command);
context.set(OrderExecutionKeys.PAY_AMOUNT, new BigDecimal("99.00"));

CreateOrderCommand command = context.get(OrderExecutionKeys.COMMAND);

如果执行链需要同步停止:

java
context.terminate("risk-check-stop");

if (context.isTerminated()) {
    ExecutionTermination termination = context.getTermination();
    String reason = termination == null ? "unknown" : termination.reason();
    throw new IllegalStateException(reason);
}

组合钩子 / 管道 / 责任链时可以统一观察这个状态:

  • Pipeline 中某个 step 返回 PipelineStepResult.stop(message) 后,会写入 context.terminate(message)
  • Chain 中某个 handler / inline rule 不继续 proceed,或主动调用 context.terminate(message),会让后续组合链路看到 context.isTerminated()

与钩子 / 管道 / 责任链的关系

text
Execution

  ├── Hook
  ├── Pipeline
  └── Chain
  • Hook、Pipeline、Chain 可以依赖 Execution。
  • Execution 禁止依赖 Hook、Pipeline、Chain。
  • Hook、Pipeline、Chain 之间不互相依赖,避免语义倒置和双胞胎执行内核。

使用边界

适合:

  • 同一次执行链路内传递 traceId。
  • 在多个钩子 / 管道 / 责任链组件间传递类型安全属性。
  • 表达进程内同步中止状态。

不适合:

  • 替代业务 DTO / Command。
  • 存储跨请求、跨进程或可恢复状态。
  • 承担队列、调度、工作流、分布式事务或最终一致性。

验证命令

bash
./mvnw -pl spring-open-starters/spring-open-starter-execution -am test -DskipITs -DskipFrontend

Released under the Apache License 2.0.