图的流动由“流程引擎”驱动的，也称为：执行。“流程引擎”在执行图时，会涉及到“上下文”（提供执行时的上下文参数与对象引用），以及可以定制的“流程驱动器”。


### 1、 流程引擎（FlowEngine）


|                                        | 返回数据类型   |   描述                          |
|----------------------|------------|-------------------|
| `FlowEngine.newInstance()`   |  `FlowEngine` | 实例化引擎     |
| `FlowEngine.newInstance(driver)`   |  `FlowEngine` | 实例化引擎（指定默认驱动器）     |
| | | |
| `getDriver(graph)->FlowDriver`                                       |  | 获取图的驱动器     |
| | | |
| `addInterceptor(interceptor, index)`        |  | 添加拦截器     |
| `addInterceptor(interceptor)`        |  | 添加拦截器     |
| `removeInterceptor(interceptor)`        |  | 移除拦截器     |
| | | |
| `register(name, driver)`        |  | 注册驱动器     |
| `register(driver)`                 |  | 注册默认驱动器     |
| `unregister(name)`              |  | 注销图驱动器     |
| | | |
| `load(graphUri)`                  |  | 加载图（支持 * 号表达式批量加载）     |
| `load(graph)`                      |  | 加载图     |
| `unload(graphId)`                 |  | 卸载图     |
| `getGraphs()`                      | `Collection<Graph>` | 获取所有图     |
| `getGraph(graphId)`              | `Graph` | 获取图     |
| `getGraphOrThrow(graphId)`              | `Graph` | 获取图，没有则异常     |
| | | |
| `eval(graphId)`                                     |   | 执行图     |
| `eval(graphId, context)`                         |   | 执行图     |
| `eval(graphId, steps, context)`                         |   | 执行图     |
| `eval(graphId, steps, context, options)`                         |   | 执行图     |
| | | |
| `eval(graph)`                                         |   | 执行图     |
| `eval(graph, context)`                             |   | 执行图     |
| `eval(graph, steps, context)`                             |   | 执行图     |
| `eval(graph, steps, context, options)`                         |   | 执行图     |



主要实现有：

* FlowEngineDefault（默认实现）


### 2、流上下文接口（FlowContext）


|                                        | 返回数据类型   |   描述                          |
|----------------------|------------|-------------------|
| `+of()`                  |            | 获取上下文实例 |
| `+of(instanceId)`    |            | 获取上下文实例 |
| `+fromJson()`         | String | 从 josn 加载 |
| | | |
| `getInstanceId()`       |            | 实例id |
| | | |
| `toJson()`             | String | 转为 josn |
| `lastNodeId()`         | String | 最后执行的节点Id |
| `lastRecord()`         | String | 最后执行的节点记录 |
| `trace()`                | String | 执行跟踪 |
| | | |
| `interrupt()`         |          | 中断（当前分支不再前进）            |
| `stop()`                |          | 停止并返回（整个流不再前进）            |
| `isStopped()`                |          | 是否已停止            |
| | | |
| `eventBus()`                      | `DamiBus<C, R>` | 当前实例事件总线 |
| | | |
| `model()`                          | `Map`             | 参数集合                       |
| `put(key, value)`                | `self`              | 推入参数                       |
| `putIfAbsent(key, value)`     | `self`              | 没有时推入参数             |
| `putAll(model)`                  | `self`              | 推入参数集合                       |
| `get(key)`                         | `Object`                 | 获取参数                       |
| `getAs(key)`                      | `T`                 | 获取参数                       |
| `getOrDefault(key, def)`     | `T`                 | 获取参数或默认                        |
| `remove(key)`                   | `T`                 | 移除参数                       |
| `computeIfAbsent(key, mappingFunction)`    | `T`                 | 没有时完成参数                       |



条件或脚本任务应用时：

* FlowContext 实例在脚本里的变量名为：`context`
* 所有 model 里参数，会成为脚本里的变量（直接可用）






### 3、流程驱动器接口（FlowDriver），可自由定制



| 方法                                                  | 返回数据类型      |     描述         |
|-------------------------------|-------------|-----------|
| `onNodeStart(exchanger, node)`              |                        | 节点开始时    |
| `onNodeEnd(exchanger, node)`                |                        | 节点结束时    |
| | | |
| `handleCondition(exchanger, condition)`    | `bool`             | 处理条件检测         |
| `handleTask(exchanger, task)`                  |                      | 处理执行任务         |
| `postHandleTask(exchanger, task)`           |                      | 提交处理任务（有些场景，需要二次控制）         |

主要实现有：

* SimpleFlowDriver（简单流程驱动器）
