Activiti笔记

工作流

什么是工作流(Workflow)?
工作流是针对工作中具有固定程序的常规活动而提出的一个概念,通过将工作活动分解定义良好的任务、过程、角色和规则来进行执行和监控,达到提高生产组织水平和工作效率的目的,工作流技术为企业更好地实现经营目标提供了先进的手段。

工作流管理联盟给出的工作流定义是:工作流是指整个或部分经营过程在计算机支持下的全自动或半自动化,在实际情况中可以更广泛地把凡是由计算机软件系统(工作流管理系统)控制其执行的过程都称为工作流。

PeopleSoft公司给出的定义是:工作流是一个用来实施经营过程实践的机制。

IBM Almaden 研究中心给出的定义是:工作流是经营过程的一种计算机化的表示模型,定义了完成整个过程所需用的各种参数。这些参数包括对过程中每一个步骤的定义、步骤间的执行顺序、条件以及数据流的建立、每一步骤由谁负责以及每个活动所需要的应用程序。

看到一个简单的解释:把计算机技术在工作流程管理中的应用称为工作流技术。

Workflow 关注的是如何缩短流程闲置时间,从而提高企业的业务处理能力并使企业能够关注于真正对企业有意义的增值业务上。从建立企业神经系统的角度也许更能理解两者的区别。传统软件不能解决工作流的问题,例如ERP关注的是企业的资源配置,但不可能解决资源传输过程中的损耗和降低传输(流程)的成本;同样workflow也不能完全解决传统管理软件所能解决的问题,例如对生产管理的MRP系统所能解决的生产过程控制通过workflow很难实现。但一个好的传统软件如果希望能自动化地在整个企业中应用起来,必须有一个强大的逻辑层,用以解决信息传递的逻辑判断和自动流转,这个时候就需要workflow的平台。

工作流引擎

工作流引擎是指工作流作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。

简单讲,工作流引擎就是前人写好的工作流解决方案,后面的人可以直接根据实际的流程逻辑套用,省去造轮子的过程。

Activiti

简介

Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。

Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的快速、稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。

业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解。这个标准 是由对象管理组(Object Management Group - OMG)维护的。

先从BPMN 2.0 开始讲

为什么先讲BPMN 2.0?可能会有奇效。

BPMN 2.0 是以XML的格式定义的,以 .bpmn20.xml 或者 .bpmn 结尾的XML文件。

根元素

根元素为 <definitions>,在根元素里边可以定义多个流程定义 <process>。但是建议每个文件只有一个流程定义,方便开发过程和后期维护工作。

一个空的流程定义如下所示:

1
2
3
4
5
6
7
8
9
10
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">

<process id="myProcess" name="My First Process">
..
</process>

</definitions>
  • 每个process的id是必填属性,后面会用到。name为选填属性。

Events(事件)

在BPMN2.0执行语义中像启动、结束、边界条件以及每个活动的创建、开始、流转等都是流程事件,利用事件机制,可以通过事件控制器为系统增加辅助功能,如其它业务系统集成、活动预警等。

启动事件
<startEvent id="startevent" name="开始"> ... </startEvent>
  • 空启动事件

    由于startEvent标签内没有任何元素定义,因此表示一个空启动事件

    属性:

属性名称 属性说明
activiti:formKey Activiti扩展的formKey属性,可以用来指定启动事件关联的表单文件
activiti:initiator Activiti扩展的initiator事件,可以用来记录启动路程人的ID,启动流程之后此属性指定的变量就会自动设置当前人的名称
  • 定时启动事件

    定时启动事件可以用于一次性定时启动,也可以用于特定时间定时启动

      <timerEventDefinition></timerEventDefinition>
    

    属性:

属性名称 属性说明
timeDate 一次性定时启动,具体到一个日期
timeDuration 设置多长时间之后启动任务。
timeCycle 周期性启动任务,用来设定循环的时间间隔,表示多长时间执行一次循环。
  • 异常启动事件

    异常启动事件可以出发一个异常子流程,但不能通过API方式启动,总是在另外一个子流程抛出异常结束事件的时候被触发。异常启动事件”捕获型”,而异常结束事件是抛出型的

      <errorEventDefinition></errorEventDefinition>
    
结束事件
<endEvent id="endevent" name="结束"> ... </endEvent>
  • 空结束事件

    结束事件是抛出型的。空结束事件不处理抛出结果,空结束事件一般用于正常结束流程。

  • 异常结束事件

    异常结束事件时有抛出结果的,它定义了需要抛出的错误代码,如果找到了异常开始事件定义的异常代码,则会触发异常开始事件,否则按照空结束事件处理。

  • 终止结束事件

    终止结束事件会结束整个流程实例,而空结束事件只会结束当前流程路径。

      <terminateEventDefinition/>
    

^Events

Sequence Flow(顺序流)

SequenceFlow是两个元素之间的连接器,它将指向来源和去向两个元素。

<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />

顺序流分为:条件顺序流和默认顺序流。

^SequenceFlow

Gateways(网关)

网关用于控制执行流程。

  • Exclusive Gateway(专用网关/排他网关)

    当执行到达这个网关时,所有流入顺序都会进行条件判断,结果为真的流程可以继续进行。只能有一个为真的结果。

      <exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" />
    

api总览

  • Parallel Gateway(并行网关)

    并行网关允许分成多个执行路径或加入多个传入的执行路径。

      <parallelGateway id="myParallelGateway" />
    

api总览

  • Inclusive Gateway(包含网关)

    包容网关可以被看作专用网关和并行网关的组合。与专用网关一样,包容网关可以定义流出顺序流的条件,网关将对其进行判断。但主要区别在于包容网关可以允许多个序列流,如并行网关。

      <inclusiveGateway id="myInclusiveGateway" />
    

api总览

  • Event-based Gateway(事件网关)

    事件网关是专门为中间捕获事件设置的,它允许多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后流程处于等待的状态,因为中间等待事件需要依赖中间抛出事件触发

      <eventBasedGateway id="myEventBasedGateway" />
    

api总览

^Gateways

Tasks(任务)

  • User Task(人工任务)

    人工任务需要用户人员来完成。当流程执行到达这样的用户任务时,在分配给该任务的用户或组的任务列表中创建新的任务。

      <userTask id="theTask" name="Important task" />
    

    可以使用documentation元素来对任务进行描述:

      <documentation>
          这是任务描述。
      </documentation>
    

    属性:

属性名称 属性说明
activiti:dueDate 设置任务的到期时间
activiti:assignee 将任务指定给某个人。(以属性方式进行)
humanPerformer 将任务指定给某个人。(以元素标签方式进行,效果同前一个属性)
activiti:candidateUsers 允许用户(可以是多个用户)成为任务的候选人。(以属性方式进行)
activiti:candidateGroups 允许一组用户(可以是多组用户)成为任务的候选人。(以属性方式进行)
potentialOwner 将任务分配给某个组/候选人列表。(以元素标签方式进行,效果同前两个属性)
  • Script Task(脚本任务)

    脚本任务是一个自动活动。当流程执行到达脚本任务时,执行相应的脚本任务。

      <scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy">
          <script>
              sum = 0
              for ( i in inputArray ) {
                  sum += i
              }
          </script>
      </scriptTask>
    
  • Java Service Task(Java服务任务)

    Java服务任务是一个自活动任务,用于调用外部Java类。

      <serviceTask id="javaService"
           name="My Java Service Task"
           activiti:class="org.activiti.MyJavaDelegate" />
    
  • Web Service Task(Web服务任务)

    Web服务任务用于同步调用外部Web服务。

  • Business Rule Task(业务规则任务)

    业务规则任务用于同步执行一个或多个规则。

  • Email Task(电子邮件任务)

    允许通过向一个或多个收件人发送电子邮件的自动邮件服务任务来增强业务流程。

  • Manual Task(手工任务)

    手动任务定义了BPM引擎外部的任务。它被用来模拟由某人完成的工作,引擎不需要知道该工作,也没有系统或UI界面。

      <manualTask id="myManualTask" name="Call client for more information" />
    
  • Java Receive Task(Java接收任务)

    接收任务是一个简单的任务,等待某个消息的到来。当流程执行到达接收任务时,流程状态被提交给持久性存储。

      <receiveTask id="waitState" name="wait" />
    

^Tasks

Sub-Process(子流程)

  • Sub-Process(子流程)

    子流程是一个包含其他活动,网关,事件等的活动,它本身就形成了一个更大流程的一部分。因为子流程嵌入在主流程中,所有也叫”嵌入式子流程”。

    子流程只能有一个无启动事件,不允许有其他的启动事件类型。一个子流程必须至少有一个结束事件。

      <subProcess id="subProcess">
          <startEvent id="subProcessStart" />
              ... other Sub-Process elements ...
          <endEvent id="subProcessEnd" />
      </subProcess>
    
  • Event Sub-Process(事件子流程)

    事件子流程是由事件触发的子流程。事件子流程可以在流程级别或任何子流程级别添加。用于触发事件子流程的事件使用开始事件进行配置。由此可见,事件子过程不支持任何启动事件。事件子流程可能会使用诸如消息事件,错误事件,信号事件,计时器事件或补偿事件等事件触发。

      <subProcess id="eventSubProcess" triggeredByEvent="true">
          ...
      </subProcess>
    

^Sub-Process

IDE 安装 Activiti Designer 插件

此过程省略,网上教程很多。

之后

本文采用的是Activiti 6.0.0 版本,官网下载地址(www.activiti.org/download.html)。

Activiti 6.0.0 要求 JDK 7+

Maven依赖

单独使用Activiti的maven依赖:

1
2
3
4
5
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>

核心API介绍

总览:

api总览

ProcessEngine、RepositoryService、RuntimeService、TaskService、ManagementService、IdentityService、HistoryService、FormService

    ProcessEngine processEngine = ProcessEngine.getDefaultProcessEngine();

    RepositoryService repositoryService = processEngine.getRepositoryService();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    TaskService taskService = processEngine.getTaskService();
    ManagementService managementService = processEngine.getManagementService()
    IdentityService identityService = processEngine.getIdentityService();
    HistoryService historyService = processEngine.getHistoryService();
    FormService formService = processEngine.getFormService();
    DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService();

通过_activiti.cfg.xml_文件配置Activiti和数据库连接。

  • ProcessEngine

    Activiti的核心,在数据源配置之后可以通过ProcessEngines.getDefaultProcessEngine()获得。

  • RepositoryService

    RepositoryService可能是使用Activiti引擎时需要的第一个服务。此服务提供用于管理和操作部署和流程定义的操作。流程定义文档即bpmn文件和流程图片。

  • RuntimeService

    RuntimeService是处理启动流程定义的新流程实例。RuntimeService也是用来检索和存储过程变量的服务。

  • TaskService

    TaskService用于管理任务。

  • ManagementService

    ManagementService提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。

  • IdentityService

    Activiti中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的Task。IdentityService提供了对Activiti系统中的用户和组的管理功能。

  • HistoryService

    HistoryService用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。

  • FormService

    FormService是一个可选服务,用于管理表单。该服务引入了开始表单和任务表单的概念。开始表单是在流程实例启动之前向用户显示的表单,而任务表单是用户想要填写表单时显示的表单。

  • DynamicBpmnService

    DynamicBpmnService用于更改部分流程定义,而无需重新部署。

整合Spring

Activiti中的服务给被配置为普通的Spring Bean。整合的起点类是_org.activiti.spring.ProcessEngineFactoryBean_,在SpringBoot中,Activiti中的服务会被自动注入为Bean,无需配置。

Activiti与SpringBoot集成的Maven依赖如下:

1
2
3
4
5
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>

数据库

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。

总览
表名前缀 含义
ACT_RE_* ‘RE’表示repository,这些表包含了流程定义和流程静态资源(图片,规则等)
ACT_RU_* ‘RU’表示runtime,这些表包含了流程实例,任务,变量,异步任务等运行时数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些数据。
ACT_ID_* ‘ID’表示identity,这些表包含身份信息,比如用户,组等。
ACT_HI_* ‘HI’表示history,这些表包含了历史数据,比如历史流程实例,变量,任务等。
ACT_GE_* 通用数据,用于不同场景下,如存放资源文件等。
详细
表名 含义
act_re_deployment 部署信息表
act_re_model 流程设计模型部署表
act_re_procdef 流程定义数据表
act_ru_execution 运行时流程执行实例表
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与人员的信息
act_ru_tast 运行时任务节点表
act_ru_variable 运行时流程变量数据表
act_hi_actinst 历史节点表
act_hi_attachement 历史附件表
act_hi_comment 历史意见表
act_hi_identitylink 历史流程人员表
act_hi_detail 历史详情表
act_hi_procinst 历史流程实例表
act_hi_taskinst 历史任务实例表
act_hi_varinst 历史标量表
act_id_group 用户组信息表
act_id_info 用户扩展信息表
act_id_membership 用户与用户组对应信息表
act_id_user 用户信息表
act_ge_bytearray 二进制数据表
act_ge_property 属性信息表