写点什么

Activiti6

  • 2022 年 4 月 30 日
  • 本文字数:2749 字

    阅读完需:约 9 分钟

[](()RepositoryService

流程定义相关


RepositoryService 可能是使用 Activiti 引擎时最先接触的服务。 它提供了管理和控制发布包和流程定义的操作。 这里不涉及太多细节,流程定义是 BPMN 2.0 流程的 java 实现。 它包含了一个流程每个环节的结构和行为。 发布包是 Activiti 引擎的打包单位。一个发布包可以包含多个 BPMN 2.0 xml 文件和其他资源。 开发者可以自由选择把任意资源包含到发布包中。 既可以把一个单独的 BPMN 2.0 xml 文件放到发布包里,也可以把整个流程和相关资源都放在一起。 (比如,'hr-processes’实例可以包含 hr 流程相关的任何资源)。 可以通过 RepositoryService 来部署这种发布包。 发布一个发布包,意味着把它上传到引擎中,所有流程都会在保存进数据库之前分析解析好。 从这点来说,系统知道这个发布包的存在,发布包中包含的流程就已经可以启动了。


除此之外,服务可以


  • 查询引擎中的发布包和流程定义。

  • 暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。

  • 获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。

  • 获得流程定义的 pojo 版本, 可以用来通过 java 解析流程,而不必通过 xml。

[](()RuntimeService

RuntimeService 正好是完全相反的。它负责启动一个流程定义的新实例。 如上所述,流程定义定义了流程各个节点的结构和行为。 流程实例就是这样一个流程定义的实例。对每个流程定义来说,同一时间会有很多实例在执行。 RuntimeService 也可以用来获取和保存流程变量。 这些数据是特定于某个流程实例的,并会被很多流程中的节点使用 (比如,一个排他网关常常使用流程变量来决定选择哪条路径继续流程)。 Runtimeservice 也能查询流程实例和执行。 执行对应 BPMN 2.0 中的’token’。基本上执行指向流程实例当前在哪里。 最后,RuntimeService 可以在流程实例等待外部触发时使用,这时可以用来继续流程实例。 流程实例可以有很多暂停状态,而服务提供了多种方法来’触发’实例, 接受外部触发后,流程实例就会继续向下执行。

[](()TaskService

任务是由系统中真实人员执行的,它是 Activiti 这类 BPMN 引擎的核心功能之一。 所有与任务有关的功能都包含在 TaskService 中:


  • 查询分配给用户或组的任务

  • 创建_独立运行_任务。这些任务与流程实例无关。

  • 手工设置任务的执行者,或者这些用户通过何种方式与任务关联。

  • 认领并完成一个任务。认领意味着一个人期望成为任务的执行者, 即这个用户会完成这个任务。完成意味着“做这个任务要求的事情”。 通常来说会有很多种处理形式。

[](()IdentityService

IdentityService 非常简单。它可以管理(创建,更新,删除,查询…)群组和用户。 请注意, Activiti 执行时并没有对用户进行检查。 例如,任务可以分配给任何人,但是引擎不会校验系统中是否存在这个用户。 这是 Activiti 引擎也可以使用外部服务,比如 ldap,活动目录,等等。

[](()FormService

FormService 是一个可选服务。即使不使用它,Activiti 也可以完美运行, 不会损失任何功能。这个服务提供了_启动表单_和_任务表单_两个概念。 _启动表单_会在流程实例启动之前展示给用户, _任务表单_会在用户完成任务时展示。Activiti 支持在 BPMN 2.0 流程定义中设置这些表单。 这个服务以一种简单的方式将数据暴露出来。再次重申,它时可选的, 表单也不一定要嵌入到流程定义中。

[](()HistoryService

HistoryService 提供了 Activiti 的所有历史数据。 在执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。

[](()ManagementService

ManagementService 在使用 Activiti 的定制环境中基本上不会用到。 它可以查 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 询数据库的表和表的元数据。另外,它提供了查询和管理异步操作的功能。 Activiti 的异步操作用途很多,比如定时器,异步操作, 延迟暂停、激活,等等。


[](()数据库表简介




Activiti 的表都以**ACT_**开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对应。


  • ACT_RE_*: 'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

  • ACT_RU_*: 'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

  • ACT_ID_*: 'ID’表示 identity。 这些表包含身份信息,比如用户,组等等。

  • ACT_HI_*: 'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。

  • ACT_GE_*: 通用数据, 用于不同场景下。


[](()使用 Activiti 的服务




使用 activiti 来完成一个基本流程,大致过程如下

[](()1.发布流程

任何与“静态”资源有关的数据(比如流程定义)都可以通过 RepositoryService 访问。 从概念上讲,所以静态数据都是 Activiti 的资源内容。


repositoryService.createDeployment()


.addClasspathResource("org/activiti/test/VacationRequest.bpmn20.xml")


.deploy();

[](()2.启动一个流程实例

把流程定义发布到 Activiti 引擎后,我们可以基于它发起新流程实例。 对每个流程定义,都可以有很多流程实例。 流程定义是“蓝图”,流程实例是它的一个运行的执行。


ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);

[](()3.完成任务

流程启动后,第一步就是用户任务。这是必须由系统用户处理的一个环节。 通常,用户会有一个“任务列表”,展示了所有必须由整个用户处理的任务。 下面的代码展示了对应的查询可能是怎样的:


List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();


for (Task task : tasks) {


Log.info("Task available: " + task.getName());


}


为了让流程实例继续运行,我们需要完成整个任务。对 Activiti 来说,就是需要complete任务。 下面的代码展示了如何做这件事:


taskService.complete(task.getId(), taskVariables);


流程实例会进入到下一个环节.


[](()事务




已经封装好了,很简单直接用


public class UserBean {


/** 由 Spring 注入 */


private RuntimeService runtimeService;


@Transactional


public void hello() {


//这里,你可以在你们的领域模型中做一些事物处理。


//当在调用 Activiti RuntimeService 的 startProcessInstanceByKey 方法时,


//它将会结合到同一个事物中。


runtimeService.startProcessInstanceByKey("helloProcess");


}


public void setRuntimeService(RuntimeService runtimeService) {


this.runtimeService = runtimeService;


}


}

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Activiti6_Java_爱好编程进阶_InfoQ写作社区