Solon Flow 可提供通用流程编排能力。支持元数据配置，支持开放式的驱动定制（像 JDBC 有 MySQL 或 PostgreSQL 等不同驱动一样）。可用于支持：

* 可用于计算（或任务）的编排场景
* 可用于业务规则和决策处理型的编排场景
* 可用于可中断、可恢复流程（结合自动前进，停止，再执行）的编排场景


### 1、主要概念


| 概念          | 简称          | 备注            | 相关接口                | 
|-------------|-------------|---------------|---------------------| 
| 流程图             | 图（或流图）          |                                     | Graph, GraphSpec    | 
| 流程节点          | 节点（或流节点）    | 可带任务，可带任务条件   | Node, NodeSpec      | 
| 流程连接线       | 连接（或流连接）    | 可带连接条件                  | Link, LinkSpec      | 
|             |             |               |                     | 
| 流程引擎（用于执行图） | 引擎（流引擎）        |               | FlowEngine          | 
| 流程驱动器                   | 驱动器（流驱动器）   |  像 JDBC 驱动（可定制）             | FlowDriver          | 
|             |             |               |                     | 
| 流程上下文       | 上下文（或流上下文）  |               | FlowContext         | 
| 流程拦截器       | 拦截器（或流拦截器）  |               | FlowInterceptor     | 



概念关系描述（就像用工具画图）：

* 一个图（Graph），由多个节点（Node）和连接（Link）组成。
* 一个节点（Node），会有多个连接（Link，也叫“流出连接”）连向别的节点。
    * 连接向其它节点，称为：流出连接。
    * 被其它节点连接，称为：流入连接。
* 一个图“必须有且只有”一个 start 类型的节点，且从 start 节点开始，顺着连接（Link）流出。
* 流引擎在执行图的过程，可以有上下文（FlowContext），可以被阻断分支或停止执行


通俗些，一个图就是通过 “点”（节点） + “线”（连接）画出来的一个结构。


### 2、配置字典参考



* Graph，配置属性

| 属性    | 数据类型     |  需求  | 描述                                       |
|-------|---------|-----|--------------------------|
| id        | `String`      | 必填 | 图Id（要求全局唯一）               |
| title     | `String`      |        | 显示标题                                    |
| driver   | `String`      |        | 驱动器（缺省为默认驱动器）    |
| meta    | `Map`       |        | 元数据（用于应用扩展）                |
| layout  | `Node[]`    |        | 编排（或布局）                                        |



* Node，配置属性

| 属性       | 数据类型                   |  需求  |描述                |
|----------|---------------|------|-------------------|
| id       | `String`                               |  | 节点Id（要求图内唯一） <br/>//不配置时，会自动生成    |
| type    | `NodeType`                         |  | 节点类型<br/>//不配置时，缺省为 activity 类型            |
| title    | `String`                                |  | 显示标题              |
| meta   | `Map`                                  |  | 元数据（用于应用扩展）。为 task 提供扩展配置               |
| link     | `String` or `Link` <br/>`String[]`  or `Link[]` |    | 连接（支持单值、多值）<br/>//不配置时，会自动连接后一个节点 |
| task    | `String`                                |   | 任务描述（会触发驱动的 handleTask 处理）               |
| when   | `String`                                |   | 任务执行条件描述（会触发驱动的 handleCondition 处理）    |

link 全写配置风格为 Link 类型结构；简写配置风格为 Link 的  nextId 值（即 String 类型）

* Link，配置属性


| 属性         | 数据类型            |  需求   | 描述         |
|---------|-------------|------|------------|
| nextId       | `String`             |   必填  | 后面的节点Id          |
| title          | `String`             |           | 显示标题                            |
| meta        | `Map`               |            | 元数据（用于应用扩展）        |
| when       | `String`             |            | 分支流出条件描述（会触发驱动的 handleCondition 处理）       |

* 节点类型（NodeType 枚举成员）


|              | 描述                            | 任务 | 连接条件 | 多线程 | 可流入<br/>连接数  | 可流出<br/>连接数   | 备注   | 
|--------|--------------------|----|-------|------|---------|---------|---------|
| start        | 开始                            | /      | /         | /         | `0`     | `1`     |       | 
| activity     | 活动节点（缺省类型）    | 可有 | /         | /         | `1...n` | `1`     |      | 
| inclusive   | 包容网关（类似多选）    | /      | 支持    | /         | `1...n` | `1...n` |     | 
| exclusive   | 排它网关（类似单选）    | /     | 支持    | /         | `1...n` | `1...n` |     | 
| parallel     | 并行网关（类似全选）    | /     | /         | 支持     | `1...n` | `1...n` |    | 
| loop         | 循环网关                      | /     | /         | /         | `1`     | `1`      | （v3.4.3 后支持）  | 
| end          | 结束                            | /     | /         |  /        | `1...n` | `0`     |     | 




**配置示例（支持 yml 或 json）：**

```yml
# demo1.yml（完整模式）
id: "c1"
layout: 
  - { id: "n1", type: "start", link: "n2"}
  - { id: "n2", type: "activity", link: "n3", task: "System.out.println(\"hello world!\");"}
  - { id: "n3", type: "end"}
```


### 3、图配置的简化模式说明

属性简化：

* 当没有 `id` 属性时，会按顺序自动生成（格式示例："n-1"）
* 当没有 `link` 属性时，会按顺序自动连接后一个节点
* 当没有 `type` 属性时，缺省为 `activity` 节点类型

节点简化：

* 当没有 `type=start` 节点时，按顺序第一个节点为开始节点
* 当没有 `type=end` 节点时，不影响执行

示例（基于上个图配置的简化）：

```yaml
# demo1.yml（简化模式）
id: "c1"
layout: 
  - { task: "System.out.println(\"hello world!\");"}
```

简化模式，可为业务规则编排时带来很大方便。
