4. 活动详解
在 BPMN 2.0 中,活动(Activity) 是流程中执行工作的基本单元。本章深入解析两大类活动:任务(Task) 与 子流程(Sub-Process),以及特殊的重用机制 调用活动(Call Activity)。掌握它们的区别与适用场景,是建模准确、可执行流程的关键。
4.1 任务类型概览
任务是不可再分的最小工作单元,BPMN 2.0 定义了 6 种标准任务类型,分别对应不同的执行方式:
| 任务类型 | 执行者 | 典型场景 |
|---|---|---|
| 人工任务(Manual Task) | 人(线下操作) | 签收纸质文件、人工称重 |
| 用户任务(User Task) | 人(通过系统) | 审批工单、填写表单 |
| 服务任务(Service Task) | 系统/服务 | 调用 API、执行数据库操作 |
| 发送任务(Send Task) | 系统 | 发送邮件、MQ 消息 |
| 接收任务(Receive Task) | 系统/人 | 等待外部响应、接收文件 |
| 脚本任务(Script Task) | 引擎 | 执行 Groovy 脚本、计算表达式 |
关键区分:人工任务与用户任务都涉及人,但人工任务通常指不借助信息系统的手工操作;用户任务则依赖流程引擎提供的任务列表界面。建模时应优先使用用户任务以支持流程的自动跟踪与分配。
4.2 子流程与调用活动
当流程中的某一段逻辑需要独立封装或复用,就需要将活动升级为子流程或调用活动。
- 子流程(Sub-Process):内嵌在当前流程定义中,展开后包含完整的一组活动。子流程内的边界事件可以捕获或抛出异常,实现局部补偿。
- 调用活动(Call Activity):引用一个独立的全局流程定义(通常是发布为独立流程的“可重用子流程”)。调用活动不展开内部细节,只传递输入/输出数据。
| 对比维度 | 子流程(内嵌) | 调用活动(全局) |
|---|---|---|
| 定义位置 | 当前流程内部 | 外部独立流程定义 |
| 重用范围 | 仅当前流程 | 可被多个流程调用 |
| 内部事件影响 | 支持边界事件(异常处理) | 不直接支持边界事件 |
| 执行行为 | 展开后执行内部活动 | 启动被调用流程实例,等待返回 |
常见错误:将调用活动当作子流程来画,却在调用活动上附加边界事件。调用活动本身是“黑盒”,边界事件应定义在被调用的全局流程内部。如需异常处理,请使用内嵌子流程。
4.3 案例分析:订单审核与发货流程
以电商订单处理为例,下图展示混合使用多种任务类型、子流程与调用活动的典型场景:
流程描述:收到客户订单后,系统首先执行服务任务检查库存;若库存充足,启动人工任务“仓库拣货”;同时通过发送任务向客户发送确认邮件;之后进入内嵌子流程“支付处理”(包含收款、退款校验等内部活动);支付成功后调用调用活动“物流发货”(复用独立定义的出库流程);最终由用户任务“客户签收确认”结束。
4.4 任务类型选择实践清单
在实际建模中,遵循以下清单可避免常见设计错误:
- 确认执行主体:如果工作由人完成且不依赖系统,用 人工任务;如果人通过待办列表操作,用 用户任务。
- 自动操作判断:无人工干预的系统调用使用 服务任务;发送消息(邮件/队列)用 发送任务;等待外部消息到达用 接收任务。
- 子流程 vs 调用活动:只在单一流程内使用且需要局部异常处理,用 内嵌子流程;需要跨流程复用,用 调用活动。
- 避免“万能任务”:不要将所有行为都塞入“用户任务”或“服务任务”,根据 BPMN 语义选择最精确的类型,提升流程的可读性与可执行性。
- 命名规范:任务名称应体现“动宾短语”,如“审核订单”“调用库存API”,避免模糊动词如“处理”“操作”。
总结:活动是流程的骨架,选对任务类型决定了流程能否被正确理解与自动化。子流程与调用活动则提供了分层与复用的能力。下一层将对“网关”进行详细拆解。