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

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

概念：

* 连接其它节点，称为：“流出连接”。
* 被其它节点连接，称为：“流入连接”。
* 一个节点的流经过程：“流入” -> “执行任务” -> “流出”。
* 每个任务（task），都可以带一个任务触发条件（when）

提醒：

* 网关的“执行任务”，v3.6.1 后支持


### 1、start （开始）

一个图，"必须有且只有”一个 start 节点，作为图的入口。之后顺着“连接”流出。


示例：

```yaml
id: demo1
layout:
  - type: start
  - type: end
```

### 2、activity （活动）

activity 节点，主要用于触发处理任务事件。可以带一个任务触发条件（when）。


| 流入 | 流出 | 
| -------- | -------- | 
| 无限制性要求。     | 无条件、或满足条件的都可流出。。。（v3.8 前为，单“连接”流出）     | 


示例：

```yaml
id: demo1
layout:
  - type: start
  - type: activity
    task: 'System.out.println("hello world!");'
  - type: end
```


### 3、inclusive （包容网关），相当于多选。要“成对”使用！

inclusive 节点，可以有多个流入连接，或多个流出连接。


| 流入（也可叫汇聚，或栏栅） | 流出 | 
| -------- | -------- | 
| （如果前面有 inclusive 流出）会等待所有满足条件的流入连接到齐后（起到聚合作用），才会往后流出。。。否则，无限制性要求。     | 无条件、或满足条件的都可流出。。。相当于“多选”。     | 



示例：

```yaml
id: demo1
layout:
  - type: start
  - {type: inclusive, link: [{nextId: n1, when: 'b>1'}, {nextId: n2, when: 'a>1'}]} #流出
  - {type: activity, task: "@Task1", id: n1, link: g_end}
  - {type: activity, task: "@Task2", id: n2, link: g_end}
  - {type: inclusive, id: g_end} #流入
  - type: end
```



### 4、exclusive （排它网关），相当于单选


exclusive 节点，最多只能有一个流出连接。


| 流入 | 流出 | 
| -------- | -------- | 
| 无限制性要求。     | 只能有一个满足条件的连接可流出。。。相当于“单选”。<br/><br/>如果没有匹配的连接，则使用缺省（没有条件的连接）。<br/>如果有多个满足条件的连接，则按优先级排序，最优先的流出。<br/>如果没有缺省，就结束了。     | 



示例：

```yaml
id: demo1
layout:
  - type: start
  - {type: exclusive, link: [n1, {nextId: n2, when: 'a>1'}]} #流出
  - {type: activity, task: "@Task1", id: n1, link: g_end}
  - {type: activity, task: "@Task2", id: n2, link: g_end}
  - {type: exclusive, id: g_end} #流入（也可以不需要，直接到 end）
  - {type: end, id: end}
```




### 5、parallel （并行网关），相当于全选。要“成对”使用！


parallel 节点，可以有多个流入连接，或多个流出连接。



| 流入（也可叫汇聚，或栏栅） | 流出 | 
| -------- | -------- | 
| 会等待所有流入连接到齐后（起到聚合作用），才会往后流出。     | 所有连接都可流出，条件无效。。。相当于“全选”。     | 



示例：

```yaml
id: demo1
layout:
  - type: start
  - {type: parallel, link: [n1, n2]} #流出
  - {type: activity, task: "@Task1", id: n1, link: g_end}
  - {type: activity, task: "@Task2", id: n2, link: g_end}
  - {type: parallel, id: g_end} #流入
  - type: end
```



### 6、loop （循环网关）


loop 节点，只能有一个流入连接，或一个流出连接。注意：要“成对”使用。


| 流入（也叫汇聚，或栏栅） | 流出（需要标注元数据） | 
| -------- | -------- | 
| 会等待遍历结束后（起到聚合作用），才会往后流出。     | 遍历集合并循环流出。     | 



| 流出元数据 | 说明 | 
| -------- | -------- | 
| `$for`     | 项目变量名（遍历出的项目，将以此名推入上下文），后续节点可使用此变量     |
| `$in`     | 集合变量名（引擎会通过变量名，从上下文里取变量）     |


示例：

```yaml
id: demo1
layout:
  - type: start
  - {type: loop, meta: {"$for": "id", "$in": "idList"}} #流出（有，流出元数据）
  - {type: activity, task: "@Job"}
  - type: loop #流入
  - type: end
```

### 7、end （结束）

一个图，"必须有且只有”一个 end 节点，作为图的出口。之后，不再流出


示例：

```yaml
id: demo1
layout:
  - type: start
  - type: end
```



