12.4 流程实例与状态管理
`ProcessInstance` 是流程定义的运行时载体,管理业务流程从创建到完成的完整生命周期。每个 `ProcessInstance` 绑定一个 `ProcessDefinition`(蓝图),并通过 `WorkflowEngine` 驱动实际执行。
架构关系
ProcessDefinition(蓝图)
↓ new(inst_id, definition)
ProcessInstance(运行时)
↓ graph().clone()
WorkflowEngine(引擎)
↓ run(initial_message, session)
事件流 + 输出流
流程状态机
Created ──→ Running ──→ Completed
│ │
│ ├──→ Suspended ──→ Running(恢复)
│ │
│ ├──→ Terminated(强制终止)
│ │
│ └──→ Failed(执行错误)
│
├──→ Terminated(创建后直接终止,不经运行)
└──→ Failed(创建后直接标记失败)
pub enum ProcessState {
Created, // 已创建,尚未启动
Running, // 正在执行
Suspended, // 已挂起,等待恢复
Completed, // 正常完成
Terminated, // 强制终止
Failed, // 执行失败
}
核心 API
let def = Arc::new(ProcessDefinition::from_yaml(yaml)?);
let instance = ProcessInstance::new("order-001", def);
// 状态驱动
assert_eq!(instance.state(), ProcessState::Created);
instance.start()?; // Created → Running
instance.suspend()?; // Running → Suspended
instance.resume()?; // Suspended → Running
instance.complete()?; // Running → Completed
// 变量管理
instance.set_variable("amount", json!(150.0));
let amount = instance.get_variable("amount");
// 终止/失败
instance.terminate("用户取消")?; // 强制终止
instance.fail("外部API超时")?; // 标记失败
状态守卫
所有状态转换都有严格的守卫校验,防止非法操作:
| 操作 | 允许的状态 | 目标状态 | |------|-----------|---------| | `start()` | Created, Suspended | Running | | `suspend()` | Running | Suspended | | `resume()` | Suspended | Running | | `complete()` | Running | Completed | | `terminate()` | Created, Running, Suspended | Terminated | | `fail()` | Created, Running, Suspended | Failed |
非法状态转换(如从未 Running 状态调用 `suspend()`)会返回 `AgentError::WorkflowError`。
流程快照
`ProcessSnapshot` 提供流程状态的完整快照,可用于持久化和审计:
pub struct ProcessSnapshot {
pub process_id: String,
pub definition_id: String,
pub state: ProcessState,
pub current_node_id: Option<String>, // 当前活跃节点
pub variables: HashMap<String, serde_json::Value>,
pub started_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
let snapshot = instance.snapshot();
// → 可将 snapshot 持久化到数据库或会话存储
变量初始化
`ProcessInstance::new()` 自动初始化定义中声明的变量: - 有 `default_value` 的变量 → 初始化为默认值 - `required = true` 且无默认值的变量 → 初始化为 `null`(标记为待填充)
与 WorkflowEngine 集成
// ProcessInstance.start() 内部完成:
// 1. 状态验证(必须为 Created)
// 2. 状态切换 → Running
// 3. 创建 WorkflowEngine 并 spawn 异步任务
// 4. 消费事件流和输出流
// 5. 正常完成 → Completed,错误 → Failed
instance.start(initial_message, session).await?;
引擎在独立 tokio 任务中运行,`ProcessInstance` 通过状态机同步引擎的执行结果。事件流(`WorkflowEvent`)和输出流(`WorkflowOutput`)可供外部消费者订阅。