1.介绍

Activiti是一个工作流引擎, activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言
BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减
少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发
维护成本。

官方网站:https://www.activiti.org/

2.BPM和BPMN

BPM(Business Process Management),即业务流程管理,是一种规范化的构造端到端的业务流程,
以持续的提高组织业务效率。常见商业管理教育如EMBA、MBA等均将BPM包含在内。

BPMN(Business Process Model AndNotation)- 业务流程模型和符号 是由BPMI(BusinessProcess
Management Initiative)开发的一套标准的业务流程建模符号,使用BPMN提供的符号可以创建业务流
程。

BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准。Activiti 就是使用 BPMN 2.0 进行流程建模、流程
执行管理,它包括很多的建模符号,比如:
Event
用一个圆圈表示,它是流程中运行过程中发生的事情。

activiti7 多个form properties activiti claim_大数据

活动用圆角矩形表示,一个流程由一个活动或多个活动组成

activiti7 多个form properties activiti claim_xml_02


Bpmn图形其实是通过xml表示业务流程,上边的.bpmn文件使用文本编辑器打开:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="myleaveprocess" name="员工请假审批流程" isExecutable="true">
    <startEvent id="sid-30C5C04C-6B86-48CB-A849-F61F8410FF0F"></startEvent>
    <userTask id="sid-0B17D13A-0775-48F9-AB7F-B4F1B42419E5" name="提交请假申请" activiti:assignee="employee">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-39191196-966E-4254-9826-CB20D34C913B" sourceRef="sid-30C5C04C-6B86-48CB-A849-F61F8410FF0F" targetRef="sid-0B17D13A-0775-48F9-AB7F-B4F1B42419E5"></sequenceFlow>
    <userTask id="sid-348B9833-9B49-4512-937D-8C0A6A7755BA" name="部门主任审批" activiti:assignee="sub-leader">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-B30122A6-C14B-4A40-8C9C-0CB0769D66A7" sourceRef="sid-0B17D13A-0775-48F9-AB7F-B4F1B42419E5" targetRef="sid-348B9833-9B49-4512-937D-8C0A6A7755BA"></sequenceFlow>
    <endEvent id="sid-1AB096A5-310D-43A0-94D4-28B5C66C115C"></endEvent>
    <sequenceFlow id="sid-AA6AD2DE-719D-49A1-B076-DAC245D613B5" sourceRef="sid-348B9833-9B49-4512-937D-8C0A6A7755BA" targetRef="sid-1AB096A5-310D-43A0-94D4-28B5C66C115C"></sequenceFlow>
    <userTask id="sid-50F0FA1F-E8A5-4E0D-99DD-20F3598F5C69" name="单位领导审批" activiti:assignee="leader">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-4A201AC4-B343-466A-9058-9833D59FB9C6" sourceRef="sid-348B9833-9B49-4512-937D-8C0A6A7755BA" targetRef="sid-50F0FA1F-E8A5-4E0D-99DD-20F3598F5C69"></sequenceFlow>
    <endEvent id="sid-D9E1C646-2864-4D2E-9350-42B51B5EB7B7"></endEvent>
    <sequenceFlow id="sid-89698514-937E-4DB5-836C-C475BF7649BF" sourceRef="sid-50F0FA1F-E8A5-4E0D-99DD-20F3598F5C69" targetRef="sid-D9E1C646-2864-4D2E-9350-42B51B5EB7B7"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myleaveprocess">
    <bpmndi:BPMNPlane bpmnElement="myleaveprocess" id="BPMNPlane_myleaveprocess">
      <bpmndi:BPMNShape bpmnElement="sid-30C5C04C-6B86-48CB-A849-F61F8410FF0F" id="BPMNShape_sid-30C5C04C-6B86-48CB-A849-F61F8410FF0F">
        <omgdc:Bounds height="30.0" width="30.0" x="200.5" y="60.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-0B17D13A-0775-48F9-AB7F-B4F1B42419E5" id="BPMNShape_sid-0B17D13A-0775-48F9-AB7F-B4F1B42419E5">
        <omgdc:Bounds height="80.0" width="100.0" x="275.5" y="35.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-348B9833-9B49-4512-937D-8C0A6A7755BA" id="BPMNShape_sid-348B9833-9B49-4512-937D-8C0A6A7755BA">
        <omgdc:Bounds height="80.0" width="100.0" x="420.5" y="35.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-1AB096A5-310D-43A0-94D4-28B5C66C115C" id="BPMNShape_sid-1AB096A5-310D-43A0-94D4-28B5C66C115C">
        <omgdc:Bounds height="28.0" width="28.0" x="565.5" y="61.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-50F0FA1F-E8A5-4E0D-99DD-20F3598F5C69" id="BPMNShape_sid-50F0FA1F-E8A5-4E0D-99DD-20F3598F5C69">
        <omgdc:Bounds height="80.0" width="100.0" x="565.5" y="35.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-D9E1C646-2864-4D2E-9350-42B51B5EB7B7" id="BPMNShape_sid-D9E1C646-2864-4D2E-9350-42B51B5EB7B7">
        <omgdc:Bounds height="28.0" width="28.0" x="710.5" y="61.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-39191196-966E-4254-9826-CB20D34C913B" id="BPMNEdge_sid-39191196-966E-4254-9826-CB20D34C913B">
        <omgdi:waypoint x="230.5" y="75.0"></omgdi:waypoint>
        <omgdi:waypoint x="275.5" y="75.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-AA6AD2DE-719D-49A1-B076-DAC245D613B5" id="BPMNEdge_sid-AA6AD2DE-719D-49A1-B076-DAC245D613B5">
        <omgdi:waypoint x="520.5" y="75.0"></omgdi:waypoint>
        <omgdi:waypoint x="565.5" y="75.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-4A201AC4-B343-466A-9058-9833D59FB9C6" id="BPMNEdge_sid-4A201AC4-B343-466A-9058-9833D59FB9C6">
        <omgdi:waypoint x="520.5" y="75.0"></omgdi:waypoint>
        <omgdi:waypoint x="565.5" y="75.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-89698514-937E-4DB5-836C-C475BF7649BF" id="BPMNEdge_sid-89698514-937E-4DB5-836C-C475BF7649BF">
        <omgdi:waypoint x="665.5" y="75.0"></omgdi:waypoint>
        <omgdi:waypoint x="710.5" y="75.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-B30122A6-C14B-4A40-8C9C-0CB0769D66A7" id="BPMNEdge_sid-B30122A6-C14B-4A40-8C9C-0CB0769D66A7">
        <omgdi:waypoint x="375.5" y="75.0"></omgdi:waypoint>
        <omgdi:waypoint x="420.5" y="75.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

3.使用步骤

activiti7 多个form properties activiti claim_xml_03

4.表结构介绍

25张表:

activiti7 多个form properties activiti claim_建模_04

4.1表的命名规则和作用

看到刚才创建的表,我们发现Activiti 的表都以 ACT_ 开头。
第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对应。
ACT_RE :'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU:'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

ACT_HI:'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE : GE 表示 general。 通用数据, 用于不同场景下

4.2Activiti数据表介绍

表分类表名解释
一般数据
[ACT_GE_BYTEARRAY] 通用的流程定义和流程资源
[ACT_GE_PROPERTY] 系统相关属性
流程历史记录
[ACT_HI_ACTINST] 历史的流程实例
[ACT_HI_ATTACHMENT] 历史的流程附件
[ACT_HI_COMMENT] 历史的说明性信息
[ACT_HI_DETAIL] 历史的流程运行中的细节信息
[ACT_HI_IDENTITYLINK] 历史的流程运行过程中用户关系
[ACT_HI_PROCINST] 历史的流程实例
[ACT_HI_TASKINST] 历史的任务实例
[ACT_HI_VARINST] 历史的流程运行中的变量信息
流程定义表
[ACT_RE_DEPLOYMENT] 部署单元信息
[ACT_RE_MODEL] 模型信息
[ACT_RE_PROCDEF] 已部署的流程定义
运行实例表
[ACT_RU_EVENT_SUBSCR] 运行时事件
[ACT_RU_EXECUTION] 运行时流程执行实例
[ACT_RU_IDENTITYLINK]
运行时用户关系信息,存储任务节点与参与者的相关信息
[ACT_RU_JOB] 运行时作业
[ACT_RU_TASK] 运行时任务
[ACT_RU_VARIABLE] 运行时变量表

5.Servcie服务接口

Service是工作流引擎提供用于进行工作流部署、执行、管理的服务接口,我们使用这些接口可以就是操
作服务对应的数据表。

5.1 Service创建方式

通过ProcessEngine创建Service
方式如下:

RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
5.2 Service服务接口介绍

activiti7 多个form properties activiti claim_建模_05


RepositoryService

是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的

业务流程图需要使用此service将流程定义文件的内容部署到计算机。除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。

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

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

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

RuntimeService
Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息

TaskService
Activiti的任务管理类。可以从这个类中获取任务的信息。

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

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

5.idea中的工作流插件

idea中的工作流插件下载地址–百度网盘

Activiti BPMN visualizer简单使用

1.安装

activiti7 多个form properties activiti claim_大数据_06

2,使用-绘制流程

activiti7 多个form properties activiti claim_大数据_07


activiti7 多个form properties activiti claim_业务流程_08


activiti7 多个form properties activiti claim_业务流程_09


activiti7 多个form properties activiti claim_xml_10

3.流程符号

BPMN 2.0是业务流程建模符号2.0的缩写。
它由Business Process Management Initiative这个非营利协会创建并不断发展。作为一种标识,BPMN
2.0是使用一些符号来明确业务流程设计流程图的一整套符号规范,它能增进业务建模时的沟通效率。
目前BPMN2.0是最新的版本,它用于在BPM上下文中进行布局和可视化的沟通。
接下来我们先来了解在流程设计中常见的 符号。
BPMN2.0的基本符合主要包含:

事件 Event

activiti7 多个form properties activiti claim_建模_11

活动 Activity

活动是工作或任务的一个通用术语。一个活动可以是一个任务,还可以是一个当前流程的子处理流程;

其次,你还可以为活动指定不同的类型。常见活动如下:

activiti7 多个form properties activiti claim_xml_12


网关 GateWay

网关用来处理决策,有几种常用网关需要了解:

activiti7 多个form properties activiti claim_业务流程_13


activiti7 多个form properties activiti claim_业务流程_14

流向 Flow

流是连接两个流程节点的连线。常见的流向包含以下几种:

activiti7 多个form properties activiti claim_业务流程_15

6.Activiti流程操作

6.1流程的部署

单个文件部署

/**
* 实现文件的单个部署
*/
@Test
public void test03(){
	// 1.获取ProcessEngine对象
	ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
	// 2.获取RepositoryService进行部署操作
	RepositoryService service = engine.getRepositoryService();
	// 3.使用RepositoryService进行部署操作
	Deployment deploy = service.createDeployment()
	.addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
	.addClasspathResource("bpmn/evection.png") // 添加png资源
	.name("出差申请流程")
	.deploy();// 部署流程
	// 4.输出流程部署的信息
	System.out.println("流程部署的id:" + deploy.getId());
	System.out.println("流程部署的名称:" + deploy.getName());
}

部署zip文件 将bpmn文件和png文件两个打包为一个zip文件,统一上传

/**
* 通过一个zip文件来部署操作
*/
@Test
public void test04(){
		// 定义zip文件的输入流
		InputStream inputStream =
		this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip");
		// 对 inputStream 做装饰
		ZipInputStream zipInputStream = new ZipInputStream(inputStream);
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		上传后的数据库中的数据和单个文件上传其实是一样的。
		4.1.3 操作数据表
		流程定义部署后操作activiti中的三张表
		act_re_deployment: 流程定义部署表,每部署一次就增加一条记录
		act_re_procdef :流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
		RepositoryService repositoryService = engine.getRepositoryService();
		Deployment deploy = repositoryService.createDeployment()
		.addZipInputStream(zipInputStream)
		.name("出差申请流程")
		.deploy();
		// 4.输出流程部署的信息
		System.out.println("流程部署的id:" + deploy.getId());
		System.out.println("流程部署的名称:" + deploy.getName());
}

操作数据表 :流程定义部署后操作activiti中的三张表

act_re_deployment: 流程定义部署表,每部署一次就增加一条记录
**act_re_procdef :**流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
act_ge_bytearray :流程资源表,流程部署的 bpmn文件和png图片会保存在该表中

6.2启动流程实例

流程定义部署在Activiti后就可以通过工作流管理业务流程,也就是说上边部署的出差申请流程可以使用
了。针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于Java类和Java对象的关系,类定
义好了后需要new创建一个对象使用,当然可以new出多个对象来,对于出差申请流程,张三可以发起
一个出差申请单需要启动一个流程实例。

/**
* 启动一个流程实例
*/
@Test
public void test05(){
	// 1.创建ProcessEngine对象
	ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
	// 2.获取RuntimeService对象
	RuntimeService runtimeService = engine.getRuntimeService();
	// 3.根据流程定义的id启动流程
	String id= "evection";
	ProcessInstance processInstance =
	runtimeService.startProcessInstanceByKey(id);
	// 4.输出相关的流程实例信息
	System.out.println("流程定义的ID:" +processInstance.getProcessDefinitionId());
	System.out.println("流程实例的ID:" + processInstance.getId());
	System.out.println("当前活动的ID:" + processInstance.getActivityId());
}

输出内容:
启动流程实例涉及到的表结构
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户的历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息

6.3任务查找

流程启动后,任务的负责人就可以查询自己当前能够处理的任务了,查询出来的任务都是当前用户的待
办任务

/**
* 任务查询
*/
@Test
public void test06(){
	String assignee ="zhansan";
	ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
	// 任务查询 需要获取一个 TaskService 对象
	TaskService taskService = engine.getTaskService();
	// 根据流程的key和任务负责人 查询任务
	List<Task> list = taskService.createTaskQuery()
	.processDefinitionKey("evection")
	.taskAssignee(assignee)
	.list();
	// 输出当前用户具有的任务
	for (Task task : list) {
	System.out.println("流程实例id:" + task.getProcessInstanceId());
	System.out.println("任务id:" + task.getId());
	System.out.println("任务负责人:" + task.getAssignee());
	System.out.println("任务名称:" + task.getName());
	}
}
6.4流程任务处理

任务负责人查询出来了待办的人,选择任务进行处理,完成任务

/**
* 流程任务的处理
*/
@Test
public void test07(){
	ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
	TaskService taskService = engine.getTaskService();
	Task task = taskService.createTaskQuery()
	.processDefinitionKey("evection")
	.taskAssignee("zhansan")
	.singleResult();
	// 完成任务
	taskService.complete(task.getId());
}

zhangsan处理了这个操作后,流程就流转到了 lisi处

activiti7 多个form properties activiti claim_xml_16


然后就是不同的用户登录,然后查询任务处理任务,直到任务流程走完。

6.5流程定义的查询

查询流程相关的信息,包括流程的定义,流程的部署,流程定义的版本
/**

  • 查询流程的定义
•  */
 @Test
 public void test08(){
 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
 RepositoryService repositoryService = engine.getRepositoryService();
 // 获取一个 ProcessDefinitionQuery对象 用来查询操作
 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
 List list = processDefinitionQuery.processDefinitionKey(“evection”)
 .orderByProcessDefinitionVersion() // 安装版本排序
 .desc() // 倒序
 .list();
 // 输出流程定义的信息
 for (ProcessDefinition processDefinition : list) {
 System.out.println(“流程定义的ID:” + processDefinition.getId());
 System.out.println(“流程定义的name:” + processDefinition.getName());
 System.out.println(“流程定义的key:” + processDefinition.getKey());
 System.out.println(“流程定义的version:” +
 processDefinition.getVersion());
 System.out.println(“流程部署的id:” +
 processDefinition.getDeploymentId());
 }
 }
6.6流程的删除
/**
* 删除流程
*/
@Test
public void test09(){
	ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
	RepositoryService repositoryService = engine.getRepositoryService();
	// 删除流程定义,如果该流程定义已经有了流程实例启动则删除时报错
	repositoryService.deleteDeployment("12501");
	// 设置为TRUE 级联删除流程定义,及时流程有实例启动,也可以删除,设置为false 非级联删
	除操作。
	//repositoryService.deleteDeployment("12501",true);
}

注意:项目开发中级联删除操作的权限一般只开发给超级管理员使用。

6.7从了数据库中下载流程资源

现在我们的流程资源文件已经上传到了数据库中,如果其他用户想要查看这些资源,可以从数据库中把
这些资源下载到本地。
解决方案:

  1. jdbc对blob类型处理clob类型数据读取出来就可以了。
  2. 使用activiti的api来实现操作。
    使用activiti的api来操作我们需要添加commons-io的依赖
<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
	<version>2.6</version>
</dependency>
/**
* 读取数据库中的资源文件
*/
@Test
public void test10() throws Exception{
	// 1.得到ProcessEngine对象
	ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
	// 2.获取RepositoryService对象
	RepositoryService repositoryService = engine.getRepositoryService();
	// 3.得到查询器
	ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
		.processDefinitionKey("evection")
		.singleResult();
	// 4.获取流程部署的id
	String deploymentId = definition.getDeploymentId();
	// 5.通过repositoryService对象的相关方法 来获取图片信息和bpmn信息
	// png图片
	InputStream pngInput = repositoryService.getResourceAsStream(deploymentId,definition.getDiagramResourceName());
	// bpmn 文件的流
	InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId,definition.getResourceName());
	// 6.文件的保存
	File filePng = new File("d:/evection.png");
	File fileBpmn = new File("d:/evection.bpmn");
	OutputStream pngOut = new FileOutputStream(filePng);
	OutputStream bpmnOut = new FileOutputStream(fileBpmn);
	IOUtils.copy(pngInput,pngOut);
	IOUtils.copy(bpmnInput,bpmnOut);
	pngInput.close();
	pngOut.close();
	bpmnInput.close();
	bpmnOut.close();
}
6.8流程历史信息查看

即使流程定义已经被删除了,流程执行的实例信息通过前面的分析,依然保存在Activiti的act_hi_* 的相
关表结构中,所以我们还是可以查询流程的执行的历史信息,可以通过HistoryService来查看

/**
* 流程历史信息查看
*/
@Test
public void test11(){
	ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
	// 查看历史信息我们需要通过 HistoryService来实现
	HistoryService historyService = engine.getHistoryService();
	// 获取 actinst 表的查询对象
	HistoricActivityInstanceQuery instanceQuery =historyService.createHistoricActivityInstanceQuery();
	instanceQuery.processDefinitionId("evection:1:12504");
	instanceQuery.orderByHistoricActivityInstanceStartTime().desc();
	List<HistoricActivityInstance> list = instanceQuery.list();
	// 输出查询的结果
	for (HistoricActivityInstance hi : list) {
	System.out.println(hi.getActivityId());
	System.out.println(hi.getActivityName());
	System.out.println(hi.getActivityType());
	System.out.println(hi.getAssignee());
	System.out.println(hi.getProcessDefinitionId());
	System.out.println(hi.getProcessInstanceId());
	System.out.println("-----------------------");
	}
}

activiti7 多个form properties activiti claim_xml_17