任务类型及执行方式
- 服务任务(Service Task)
-
若服务任务绑定了委托代理类(通过 camunda:delegateExpression),流程引擎会自动执行这些服务任务,并调用相应的委托代理类来执行业务逻辑。
-
对于非用户任务的服务任务,流程引擎会自动执行,无需外部触发。
- 用户任务(User Task)
-
流程引擎执行到用户任务时会暂停,并等待用户完成任务。
-
用户任务需要通过前端应用或其他方式触发 taskService.complete 方法来完成,通常意味着用户需要在界面上进行操作,如填写表单、审核内容等。
示例流程:订单审批流程
步骤包括:
-
初始化订单 (InitiateOrder) - 服务任务
-
准备订单 (PrepareOrder) - 服务任务
-
审查订单 (ReviewOrder) - 用户任务
-
确认订单 (ConfirmOrder) - 服务任务
流程执行过程
-
启动流程实例:通过调用 runtimeService.startProcessInstanceByKey 方法启动流程实例。
-
执行服务任务:流程引擎自动执行 InitiateOrder 和 PrepareOrder 服务任务,并调用相应的委托代理类。
-
到达用户任务:流程执行到 ReviewOrder 用户任务时暂停,等待用户完成任务。
-
完成用户任务:用户通过前端应用完成任务,前端应用调用后端接口,后端通过 taskService.complete 方法完成任务。
-
继续执行服务任务:用户任务完成后,流程引擎继续执行 ConfirmOrder 服务任务。
总结
服务任务:流程引擎自动执行服务任务并调用绑定的委托代理类。
用户任务:流程引擎暂停等待用户完成,完成后继续后续步骤。
自动执行:流程定义中若全是绑定了委托代理类的服务任务,流程引擎会自动执行直至结束。只有遇到用户任务时,才需外部触发以继续流程。
服务任务的优势
-
自动化处理:
-
服务任务可用于自动化处理大量数据或执行复杂业务逻辑。
-
因其自动执行的特性,能显著降低人工干预需求,提升效率。
-
灵活的业务逻辑:
-
通过绑定委托代理类,能极为灵活地实现各类业务逻辑。
-
可按需修改或扩展这些类,无需更改流程定义本身。
-
易于集成:
-
服务任务能通过委托代理类轻松与现有系统和服务集成。
-
从而使流程能够调用外部服务、进行数据库操作或使用其他业务系统的功能。
-
可维护性:
-
由于业务逻辑与流程定义分离,流程更易于维护。
-
无需修改 BPMN 文件即可更新业务逻辑。
适用场景
服务任务适用于以下情况:
-
数据处理:
-
处理大量数据的批处理作业。
-
进行数据转换、清洗或验证等操作。
-
业务规则执行:
-
执行复杂的业务规则或逻辑。
-
计算价格、折扣、税收等。
-
外部系统调用:
-
调用外部 API 或服务。
-
与 ERP、CRM 等企业级系统集成。
-
数据库操作:
-
插入、更新、删除数据库记录。
-
查询数据库以获取信息。
示例
假设存在一个批量处理订单的流程,其中涵盖以下几个服务任务:
-
读取订单 (ReadOrders) - 从数据库读取待处理的订单。
-
计算费用 (CalculateFees) - 根据订单信息计算费用。
-
发送通知 (SendNotification) - 向客户发送电子邮件通知。
-
更新状态 (UpdateStatus) - 更新订单的状态为“已处理”。
流程执行过程
-
启动流程实例:通过调用 runtimeService.startProcessInstanceByKey 方法启动流程实例。
-
执行服务任务:流程引擎会自动执行 ReadOrders、CalculateFees、SendNotification 和 UpdateStatus 服务任务,并调用相应的委托代理类来执行业务逻辑。
-
完成流程:一旦所有服务任务完成,流程实例也将完成。
总结
-
全自动化:当所有节点都是服务任务时,流程引擎会自动执行所有任务,无需人工干预。
-
数据处理:此类流程极适用于处理大量数据或执行复杂业务逻辑。
-
集成能力:服务任务能够轻松与其他系统和服务集成。
因此,如果一个流程中的所有节点都是服务任务,并且这些服务任务绑定了委托代理类,那么这个流程非常适合用于自动化处理大量的数据或执行复杂的业务逻辑,且无需人工干预。