一、工作流概念 工作流,是指业务过程的部分或整体在计算机应用环境下的自动化。通俗的讲,就是将一整个复杂的业务流程抽象出来,使用计算机语言将其建立一个有序的模型,在此模型的基础上,将人与人之间的线下审批方式转换为线上系统的自动化审批,使信息在不同的执行者之间互相传递,达到信息共享以及增加办公效率的目的。
二、BPMN2.0简介 BPMN(Business Process Model and Notation):业务流程模型和标记法,是一套规范。它定义了流程图的各个图形符号,以及使用这些图形符号将流程模型简单的表示出来的标准。下面介绍一些平时常用到的图形符号: 1、事件符号:下图中,绿色的符号为开始事件,红色的符号为结束时间,通常用于流程的开始与结束。 2、活动符号:下图中为符号为活动符号,常用的有用户服务(userTask)和子流程(SubProcess)。 3、网关符号:下图中为网关符号依次为 并行网关(ParallelGateway):所有路径会同时被选择。 排他网关(ExclusiveGateway):只有条件的计算结果为TRUE的路径会被选择,如果有多条为TRUE,则会执行第一条。 包容网关(InclusiveGateway):包容网关可以根据条件。同时执行多条路径,也可以执行一条路径,是并行网关和排他网关的综合。一般用于不确定分支的情况。 事件网关(EventGateway):可以捕获事件的网关。
三、Activiti7基础 在了解了工作流和BPMN2.0规范后,我们可以来了解一下Activiti7。 Activiti7是一个完全开源的、实现了BPMN2.0规范的工作流引擎,它专注于对各种流程任务进行控制和管理。将大量复杂的流程操作封装起来,集成为各种服务(Service),并暴露出API。在使用时,只需要根据不同业务场景下。使用相应的服务调用其API,即可实现关于流程流转的处理。如此可以让开发人员专注于复杂业务的处理,而不必关注流程流转的底层,减轻开发人员的负担,提升了开发的效率。 流程设计 我们首先要对流程进行设计,使用IDEA或Eclipse中的插件如actiBPM等工具画出流程图,这里我们定义了一个出差申请,此流程图包含开始节点、业务节点、结束节点等,在业务节点中可以指定流程定义的key,指定任务负责人等。将流程图保存为一个.bpmn的文件(图1),而实际上这个文件就是一个符合BPMN2.0规范的XML格式的文件。我们可以复制BPMN文件,将后缀改为XML后打开看到(图2)。 图1 图2 流程部署 当我们将流程设计完后,就可以将流程进行部署了,流程部署实际上就是把定义好的BPMN文件,调用Activiti7的API,加载到数据库中Activiti7相关的表中。其运行顺序是 首先Activiti7会读取配置文件activiti.cfg.xml中的数据库信息,根据配置信息创建流程引擎ProcessEngine。然后通过流程引擎获取流程定义的服务。最后根据流程定义服务的API,将流程部署到Activiti中。 相关代码及运行结果如下: 部署完成后,可以看到数据库中,Activiti7为我们自动创建了25张表。这些表就是Activiti7作为工作流引擎的基本表。后续所有的使用Activiti7的API进行的流程操作,就是在这些表中进行管理。 其中:ACT_EVT_LOG为事件日志表、ACT_GE开头的为流程通用数据表、ACT_HI开头的为历史数据表、ACT_PROCDEF_INFO为流程定义动态变更表、ACT_RE开头的为流程定义表、ACT_RU开头的为流程运行时的数据表。 发起流程实例 在流程部署完成后,我们相当于将这个流程的bpnm文件加载到了Activiti7中,但是此时我们相当于只是加载了这个流程的模型。而我们平时见到的一条一条流程则是流程的实例。流程的流转、数据的传递也是在各个流程实例中进行的。流程定义和流程实例是一对多的关系。 我们可以通过Activiti7的运行时服务(RuntimeService)的API启动流程实例。其操作顺序也是首先获取流程引擎ProcessEngine,然后根据流程引擎获取RuntimeService,再调用其startProcessInstanceByKey()方法。这样即可发起一条流程实例。 相关代码及运行结果如下: 流程处理 在流程发起后,我们新建了一条流程实例。并且已经位于第一个节点【发起人】节点。此时我们若想让流程继续流转下去,则需要进行流程提交。使流程跳转到下一节点。 可以通过流程引擎获取任务服务(TaskService),再使用TaskService的API,根据流程定义ID和当前执行人,查询到当前任务,最后调用complete()方法进行提交。 此时流程已经从第一个节点提交到第二个节点。可以在历史表(ACT_HI_TASKINST)中查看到流程的历史跳转数据。 相关代码及运行结果如下: 流程查询 在流程发起后,有时我们需要查询已经部署的流程。此时可以通过流程定义的Key查询出相应的流程定义信息。 首先通过流程引擎获取流程仓库服务(RepositoryService),再使用RepositoryService的createProcessDefinitionQuery()方法,根据流程定义ID查询出所有的流程定义。 相关代码及运行结果如下: 流程流转记录查询 在业务上常常需要查询流程的流转过程。包括流转过的节点、该节点执行人、流程的属性等。此时我们可以根据流程的实例ID,查询此流程实例历史流转记录。 首先通过流程引擎获取流程历史管理类服务(HistoryService),再使用HistoryService的createHistoricActivityInstanceQuery()方法创建流程查询对象。操作流程查询对象,既可以根据流程实例ID查询出相应的流程流转记录。 相关代码及运行结果如下:
四、总结 在进行上述操作时,我们可以看到,Activiti7工作流引擎在刚部署时会先创建25张表。后续一系列的操作。实际上都是通过集成的Service服务,操作这25张表中的数据。 我们已经分别使用过RepositoryService、RuntimeService、TaskService、HistoryService,在Activiti7中,常用的Service还有ManagerService,这个服务是引擎管理类,主要提供了对Activiti7的管理和维护工作。 通过服务类,操作25张表,控制流程的流转,就是Activiti7管理工作流最基本的逻辑了。
文章作者:潘彦伯 手绘插画:岳 媛
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/33255.html