PlantUML 活动图实战:从分叉到并发

puml.online

活动图经常被忽略 —— 比流程图更像流程图。这篇覆盖从基本语法到分叉 / 合并 / 异常处理。

活动图 vs 流程图

维度 流程图 活动图
表达 数据 / 控制流向 业务活动 / 流程 / 角色协作
角色划分 不区分 支持 partition / swimlane
并发 强(fork / join)
异常 没有 支持异常处理
UML 标准

最基本的活动图

1
2
3
4
5
6
7
8
9
10
11
12
@startuml
title 用户下单流程

start

:用户提交订单;
:系统校验参数;
:扣减库存;
:生成订单;

stop
@enduml
  • start / stop 是起点 / 终点
  • :活动名; 是单个活动,渲染成圆角矩形
  • 多个活动按顺序执行

判定节点

if (...) then (...) 形式:

1
2
3
4
5
6
7
8
9
10
11
@startuml
start
:用户登录;
if (密码正确?) then (是)
:进入首页;
else (否)
:提示密码错误;
:登录失败;
endif
stop
@enduml

多个分支:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@startuml
start
:选择支付方式;
switch (支付方式)
case (支付宝)
:调支付宝接口;
case (微信)
:调微信支付;
case (银行卡)
:调银联接口;
endswitch
:扣款;
stop
@enduml

switch 类似 Java 里的多分支。

循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@startuml
start
:设置 retry=0;
while (重试次数 < 3 且 仍未成功?)
:调用外部接口;
if (失败?) then (是)
:retry = retry + 1;
:等待 1s;
else (否)
:跳出循环;
endif
endwhile
stop
@enduml

while ... endwhileif ... else ... endif 跳出。

PlantUML 还有 repeat / repeat while 形式:

1
2
3
4
5
6
7
8
@startuml
start
repeat
:ping 接口;
:等待 1s;
repeat while (未响应?) is (是) not (否)
stop
@enduml

is (是) not (否) 决定循环的 true / false 分支是哪个。

并发:fork / join

活动图最大的特点是表达并行:

1
2
3
4
5
6
7
8
9
10
11
12
@startuml
start
fork
:支付网关扣款;
fork again
:风控审核;
fork again
:日志记录;
end fork
:返回结果;
stop
@enduml

fork / fork again / end fork 表达多个并行分支。

合并:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@startuml
start
:开始;
fork
:任务 A;
fork again
:任务 B;
end fork

:合并中间结果;

if (A 与 B 都成功?) then (是)
:进入下一步;
else (否)
:失败处理;
endif
stop
@enduml

end fork 之后的活动只在所有 fork 分支完成后执行。

分区(partition / swimlane)

把活动按角色划分,活动图最强大的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@startuml
title 订单处理流程 - 分区视图

|客户|
:下单;

|系统|
:验证请求;
:写入订单库;

|仓库|
:拣货;
:打包;

|物流|
:揽件;
:运输;
:派送;

|客户|
:签收;

stop
@enduml

|角色名| 切换到对应的泳道(partition)。每个角色的活动填在自己的列里。| 后的活动属于那个分区。

复杂一点的版本,连续几个活动都在同一分区可以用 partition 命名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@startuml
|客户|
start

partition 系统 {
:验证请求;
:写入订单库;
}

partition 仓库 {
:拣货;
:打包;
}

|物流|
:揽件;

stop
@enduml

partition X { ... } 把一组活动归到一区。

异常处理

PlantUML 活动图支持异常路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@startuml
start
:提交支付;

if (扣款成功?) then (是)
:返回 success;
else (否)
if (是网络错误?) then (是)
:进入 retry;
else (否)
:记录错误;
:返回 failure;
endif
endif
stop
@enduml

多层 if/else 实现类似 try/catch 的语义。如果用 fork + 分组还能更细致地表达「任意一个失败就退出整个流程」:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@startuml
start
fork
:任务 A;
fork again
:任务 B;
fork again
:任务 C;
end fork

if (任一失败?) then (是)
:回滚 A;
:回滚 B;
:回滚 C;
:返回失败;
else (否)
:完成;
stop
endif
@enduml

完整实战例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@startuml
title 内容审核流程

|创作者|
start
:提交内容;

|审核系统|
:预处理 (敏感词扫描);

if (命中敏感词?) then (是)
:标记为待审;
else (否)
:标记为通过;
:发送通知;
stop
endif

|审核员|
:收到审核任务;
:查看原文;
switch (审核结果)
case (通过)
:标记通过;
case (修改)
:给修改建议;
:返回创作者;
case (拒绝)
:标记拒绝;
:发送拒绝原因;
endswitch

|创作者|
if (收到修改建议?) then (是)
:修改内容;
|审核系统|
:重新审核;
stop
else (否)
stop
endif
@enduml

这个图描述了「内容审核」业务流程,4 个角色(创作者、审核系统、审核员、创作者)协作,覆盖:通过、修改、拒绝 3 种结果。

评审 checklist

  • 起点 / 终点清楚? start / stop 都标了?
  • 分区清晰?每个角色都明确划出?
  • fork / join 平衡?每个 fork 都有一个 join?
  • 并发分支在评审者眼里是真正独立的?
  • 异常路径都标了?
  • retry 循环有明确终止条件?

踩坑清单

  • switch 里的 case 一定要闭合 endswitch。少一个 endswitch 整张图都不渲染。
  • fork / end fork 必须成对:漏一个 end fork 后面所有 :活动; 不属于任何 flow。
  • while 内的跳出要明确:单写 while 是死循环,必须配 if ... break 或者 repeat ... while is (是) not (否)
  • 分区切换要自然|角色| 写多了评审眼花。建议用 partition X { ... } 块结构,把一组活动打包。
  • 活动名不要太长:让用户的购物车里的每一个商品都根据当前状态重新计算价格; 渲染时会被截断。建议拆分成几个活动。

与时序图的关系

场景 推荐
表达单个角色干完一件事的过程 活动图
表达多个对象之间的消息流 时序图
表达业务流程(含分支、异常、循环) 活动图
表达接口调用序列 时序图

两者常常互补:一张活动图描述「流程走法」,多张时序图描述「每一步的具体对象交互」。

与 BPMN 的关系

BPMN 是「业务流程模型和符号」,专门给业务流程建模用。PlantUML 活动图能覆盖 BPMN 80% 的核心功能:

BPMN 元素 PlantUML 表达
任务 :任务名;
网关(排他 / 并行 / 包容) if / fork / switch
序列流 --> 或隐式
池 / 道 `
子流程 partition X { ... }note right of
事件(开始 / 结束 / 中间) start / stop / (*)
消息流 :发送消息; + 同步 -->

不需要严格遵循 BPMN 的话,活动图够用;严格 BPMN 流程建议用 Camunda Modeler 之类的专用工具,再导回 PlantUML 渲染。

一句话总结

活动图在 PlantUML 里被严重低估——能表达 fork / join / 分区 / 异常,比流程图更标准,比时序图更聚焦「流程本身」。先把流程画清楚,再画时序图补对象交互,业务文档就完整了。

  • 标题: PlantUML 活动图实战:从分叉到并发
  • 作者: puml.online
  • 创建于 : 2026-07-29 15:05:00
  • 更新于 : 2026-08-14 21:34:29
  • 链接: https://puml.online/blog/plantuml-activity-diagram/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。