activity学习(一)

1,概述
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务

2,工作流引擎

ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行

3,BPMN

业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
4,数据库(先看再说)


Activiti数据库支持:
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。
1:资源库流程规则表
1) act_re_deployment 部署信息表
2) act_re_model 流程设计模型部署表
3) act_re_procdef 流程定义数据表
2:运行时数据库表
1) act_ru_execution 运行时流程执行实例表
2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
3) act_ru_task 运行时任务节点表
4) act_ru_variable 运行时流程变量数据表
3:历史数据库表
1) act_hi_actinst 历史节点表
2) act_hi_attachment 历史附件表
3) act_hi_comment 历史意见表
4) act_hi_identitylink 历史流程人员表
5) act_hi_detail 历史详情表,提供历史变量的查询
6) act_hi_procinst 历史流程实例表
7) act_hi_taskinst 历史任务实例表
8) act_hi_varinst 历史变量表
4:组织机构表
1) act_id_group 用户组信息表
2) act_id_info 用户扩展信息表
3) act_id_membership 用户与用户组对应信息表
4) act_id_user 用户信息表
                    这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足 
5:通用数据表
1) act_ge_bytearray 二进制数据表
2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,

 

03【掌握】准备工作+插件安装

1,activiti5 软件环境

1)JDK1.6或者更高版本

2)支持的数据库有:h2, mysql, oracle, postgres, mssql, db2等。

3)支持activiti5运行的jar包 或者maven库

4)开发环境为Eclipse4.1或者以上版本,sts最新版本

2,相关资源下载

1)JDK可以到sun的官网下载

http://www.oracle.com/technetwork/java/javase/downloads/index.html

2)数据库,例如:mysql可以在官网上下载。http://www.mysql.com

3)activiti也可以到Activiti官方网站下载得到。http://activiti.org/download.html

4) Eclipse4.2或者sts3.9.4也可以到相应的网站上获得下载。http://spring.io/tools/sts
 

3,安装流程设计器(eclipse插件)【安装方式一】

在有网络的情况下,安装流程设计器步骤如下:

1)打开 Help -> Install New Software. 在如下面板中

 

2)在如下Install界面板中,点击Add按钮:

 

3)然后填入下列字段s

Name: Activiti BPMN 2.0 designer

Location: http://activiti.org/designer/update/

 

4)回到Install界面,在面板正中列表中把所有展示出来的项目都勾上:

 

5)点击复选框

在Detail部分记得选中 "Contact all updates sites.." , 因为它会检查所有当前安装所需要的插件并可以被Eclipse下载.

6)安装完以后,点击新建工程new->Other…打开面板,如果看到下图内容:

 

6,对流程设计器的使用说明

虽然流程引擎在单独部署bpmn文件时会自动生成图片,但在实际开发过程中,自动生成的图片会导致和BPMN中的坐标有出入,在实际项目中展示流程当前位置图会有问题。

所在完成以上配置后,会由我们自己来管理流程图片。在发布流程时把流程规则文件和流程图片一起上传就行了。

4,安装流程设计器(eclipse插件)【安装方式二】

复制到sts里面的相关目录

5.idea 安装插件方法:

将activiti-designer-5.14的plugins的jar包放到idea的plugins里去,然后重启idea


把上面的jar包放到idea重启后就能出现actiBPM,不然这个actiBPM不会出现,安装actiBPM后就能画图了

04【掌握】Activiti5开发环境

  1. 创建项目

        

  2. 配置pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.sxt.activiti</groupId>
	<artifactId>ActivitiDemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<!-- 配置版本 -->
	<properties>
		<spring.version>4.3.17.RELEASE</spring.version>
		<mysql.version>5.1.39</mysql.version>
		<!-- 注意只能使用2.0以下的版本 -->
		<activiti.version>5.22.0</activiti.version>
		<mybatis.version>3.4.6</mybatis.version>
		<!-- 注意只能使用2.0以下的版本 -->
		<log4j.version>1.2.17</log4j.version>
	</properties>

	<dependencies>
		<!-- activiti的依赖 -->
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-engine</artifactId>
			<version>${activiti.version}</version>
		</dependency>
		<!-- ssm集成的时候使用 -->
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-spring</artifactId>
			<version>${activiti.version}</version>
		</dependency>
		<!-- mysql驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<!-- log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.7.25</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- 配置编译的jdk版本 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.7.0</version>
				<configuration>
					<!-- 指定source和target的版本 -->
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

   配置log4j.properties

log4j.rootLogger=INFO, stdout

# Console Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
# Custom tweaks
log4j.logger.com.codahale.metrics=WARN
log4j.logger.com.ryantenney=WARN
log4j.logger.com.zaxxer=WARN
log4j.logger.org.apache=WARN
log4j.logger.org.hibernate=WARN
log4j.logger.org.hibernate.engine.internal=WARN
log4j.logger.org.hibernate.validator=WARN
log4j.logger.org.springframework=WARN
log4j.logger.org.springframework.web=WARN
log4j.logger.org.springframework.security=WARN

  初始化数据

  1. 创建数据库

 

 创建类去初始化表方式一

	@Test
	public void initTables() {
		//创建数据源
		DriverManagerDataSource dataSource=new DriverManagerDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/0705activiti");
		dataSource.setUsername("root");
		dataSource.setPassword("123456");
		
		// 创建流程引擎的配置
		ProcessEngineConfiguration configuration = ProcessEngineConfiguration
				.createStandaloneProcessEngineConfiguration();
		configuration.setJdbcDriver("com.mysql.jdbc.Driver");
		configuration.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/0705activiti");
		configuration.setJdbcUsername("root");
		configuration.setJdbcPassword("123456");
        //直接数据源创建流程引擎
//		configuration.setDataSource(dataSource);
		/** 
		 * ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE  如果数据库里面没有activit的表,也不会创建
		 * ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP 创建表,使用完之后删除
		 * ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE  如果数据库里面没有表,就创建
		 * 
		 * dorp-create 代表如果数据库里面有表,那么先删除再创建
		 * 
		 */
		//配置表的初始化的方式
		configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
		
		//得到流程引擎
		ProcessEngine processEngine=configuration.buildProcessEngine();
		System.out.println(processEngine);
	}

  创建类去初始化表方式二

     创建activiti.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	
   <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
   		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/activity3? 
        useUnicode=true&amp;characterEncoding=utf-8"></property>
		<property name="username" value="root"></property>
		<property name="password" value="root"></property>
		<!--    		
		flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。
		true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。
		create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。
		drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。 -->
   		<property name="databaseSchemaUpdate" value="true"></property>
   </bean>
</beans>

创建方法


	@Test
	public void intiTables2() {
		ProcessEngineConfiguration configuration = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("/activiti.cfg.xmls");
		// 得到流程引擎
		ProcessEngine processEngine = configuration.buildProcessEngine();
		System.out.println(processEngine);

	}

   创建类去初始化表方式三

	
	@Test
	public void intiTables3() {
		//必须创建activiti.cfg.xml  并配置好数据库的信息
		ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
		System.out.println(processEngine);
	}

 

05【掌握】activiti.cfg.xml的说明

1,Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。

 

1,Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。

定义数据库配置参数:

1,jdbcUrl: 数据库的JDBC URL。

2,jdbcDriver: 对应不同数据库类型的驱动。

3,jdbcUsername: 连接数据库的用户名。

4,jdbcPassword: 连接数据库的密码。

基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池。 下面的参数可以用来配置连接池(来自MyBatis参数):

1,jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。

2,jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。

3,jdbcMaxCheckoutTime: 连接被取出使用的最长时间,超过时间会被强制回收。 默认为20000(20秒)。

4,jdbcMaxWaitTime: 这是一个底层配置,让连接池可以在长时间无法获得连接时, 打印一条日志,并重新尝试获取一个连接。(避免因为错误配置导致沉默的操作失败)。 默认为20000(20秒)。

5,dataSource 可以配置其它数据源

6,databaseSchemaUpdate  设置数据库表的创建策略

 

示例数据库配置:

 

使用其它数据源:

06【掌握】核心API

1,ProcessEngine

说明:

1)在Activiti中最核心的类,其他的类都是由他而来。

2)产生方式。

 

1,ProcessEngine获取方式

	
	@Test
	public void intiTables3() {
		//必须创建activiti.cfg.xml  并配置好数据库的信息
		ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
		System.out.println(processEngine);
		//流程图的部署  修改  删除的服务器 act_ge_bytearray, act_re_deployment, act_re_model, act_re_procdef
		RepositoryService repositoryService = processEngine.getRepositoryService();
		//流程的运行 act_ru_event_subscr, act_ru_execution, act_ru_identitylink, act_ru_job, act_ru_task, act_ru_variable
		RuntimeService runtimeService = processEngine.getRuntimeService();
		TaskService taskService = processEngine.getTaskService();
		//查询历史记录的服务器act_hi_actinst, act_hi_attachment, act_hi_comment, act_hi_detail, act_hi_identitylink, act_hi_procinst, act_hi_taskinst, act_hi_varinst
		HistoryService historyService = processEngine.getHistoryService();
		//页面表单的服务器[了解]
		FormService formService = processEngine.getFormService();
		//对工作流的用户管理的表的操作act_id_group, act_id_info, act_id_membership, act_id_user
		IdentityService identityService = processEngine.getIdentityService();
		//管理器
		ManagementService managementService = processEngine.getManagementService();
	}

2,RepositoryService

是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件,bpmn文件和流程图片。

1)产生方式

2)可以产生DeploymentBuilder,用来定义流程部署的相关参数

3)删除流程定义

 

 

3,RuntimeService

是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。

 

4,TaskService

是activiti的任务服务类。可以从这个类中获取任务的信息。

 

5,HistoryService

是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。

 

6,ProcessDefinition  act_re_procdef

流程定义类。可以从这里获得资源文件等。当流程图被部署之后,查询出来的数据就是流程定义的数据

 

7,ProcessInstance  act_ru_execution

代表流程定义的执行实例。如范冰冰请了一天的假,她就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。

 

8,Execution  act_ru_execution

Activiti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,Execution就是同ProcessInstance。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。

如图为ProcessInstance的源代码,

 

8,TaskInstance 任务实例act_ru_task

07【掌握】HelloWorld程序(模拟流程的执行)

  1. 画流程图

画流程图

  1. 设置任务的办理人

设置流程的ID和NAME

  部署流程定义

启动流程

查询任务

办理任务

#RepositoryService
SELECT * FROM `act_ge_bytearray`; #二进制文件表
SELECT * FROM `act_re_deployment`;#流程部署表
SELECT * FROM `act_re_procdef`;#流程定义
SELECT * FROM `act_ge_property`;#工作流的ID算法和版本信息表

#RuntimeService   TaskService
SELECT * FROM `act_ru_execution`;#流程启动一次只要没有执行完,就会有一条数据
SELECT * FROM `act_ru_task`;#可能有多条数据
SELECT * FROM `act_ru_variable`;#记录流程运行时的流程变量
SELECT * FROM `act_ru_identitylink`;#存放流程办理人的信息

#HistroyService
SELECT * FROM `act_hi_procinst`;#历史流程实例
SELECT * FROM `act_hi_taskinst`;#历史任务实例
SELECT * FROM `act_hi_actinst`;#历史活动节点表
SELECT * FROM `act_hi_varinst`;#历史流程变量表
SELECT * FROM `act_hi_identitylink`;##历史办理人表
SELECT * FROM `act_hi_comment`;#批注表
SELECT * FROM `act_hi_attachment`;#附件表

#IdentityService
SELECT * FROM `act_id_group` #角色
SELECT * FROM `act_id_membership`#用户和角色之间的关系
SELECT * FROM `act_id_info`#用户的详细信息
SELECT * FROM `act_id_user`#用户表

 

08【掌握】管理流程定义

功能:对流程的增加 修改  删除  查询

act_ge_bytearray act_re_deployment act_re_procdef

流程图

部署流程【两种方式 classpath  zip】

//得到流程引擎
	private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程使用classpath
	 */
	@Test
	public void deployProcess01() {
		//得到流程部署的service    act_re_deployment表有一条数据  act_re_procdef表有一条数据
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		Deployment deploy = repositoryService.createDeployment().name("请假流程001")
		.addClasspathResource("HelloWorld.bpmn")
		.addClasspathResource("HelloWorld.png")
		.deploy();
		System.out.println("部署成功:流程部署ID:"+deploy.getId());
	}
	
	/**
	 * 部署流程使用zip
	 * 流程图的文件必须是xxxx.zip结尾
	 */
	@Test
	public void deployProcess02() {
		//如果不加/代表从当前包里面找文件 
		InputStream inputStream = this.getClass().getResourceAsStream("/HelloWorld.zip");
		//如果加/代表从classpath的根目录里面找文件
		//InputStream inputStream = this.getClass().getResourceAsStream("/HelloWorld.zip");
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		ZipInputStream zipInputStream =new ZipInputStream(inputStream);
		Deployment deploy = repositoryService.createDeployment().name("请假流程001")
		.addZipInputStream(zipInputStream)//添加流程图的流
		.deploy();//确定部署
		System.out.println("部署成功,部署ID:"+deploy.getId());
	}
	

流程部署后的数据如下:

 

  查询部署信息act_re_deployment

/**
	 * 查询流程部署信息  act_re_deployment
	 */
	@Test
	public void queryProcessDeploy () {
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		//创建部署信息的查询
		String deploymentId="1";
//		Deployment deploy = repositoryService.createDeploymentQuery()
		List<Deployment> list= repositoryService.createDeploymentQuery()
		//条件
		//.deploymentId(deploymentId)  //根据部署ID去查询
		//.deploymentName(name)//根据部署名称去查询
		//.deploymentTenantId(tenantId)//根据tenantId去查询
//		.deploymentNameLike(nameLike)//根据部署名称模糊查询
		//.deploymentTenantIdLike(tenantIdLike)//根据tenantId模糊查询
		//排序
//		.orderByDeploymentId().asc()  //根据部署ID升序
		//.orderByDeploymenTime().desc() //根据部署时间降序
		//.orderByDeploymentName()//根据部署名称升序
		//结果集
		.list();  //查询返回list集合
//		.listPage(firstResult, maxResults)  分页查询返回list集合
		//.singleResult(); //返回单个对象
//		.count();
		
		/*System.out.println("部署ID:"+deploy.getId());
		System.out.println("部署名称:"+deploy.getName());
		System.out.println("部署时间:"+deploy.getDeploymentTime());*/
//		System.out.println(count);
		for (Deployment deployment : list) {
			System.out.println("部署ID:"+deployment.getId());
			System.out.println("部署名称:"+deployment.getName());
			System.out.println("部署时间:"+deployment.getDeploymentTime());
			System.out.println("########################");
		}
	}

 

  查询流程定义信息act_re_procdef

	/**
	 * 查询流程定义
	 */
	@Test
	public void queryProcDef() {
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
		//条件
//		.deploymentId(deploymentId) 根据部署ID查询
//		.deploymentIds(deploymentIds) 根据部署ID的集合查询Set<String> deploymentIds
//		.processDefinitionId(processDefinitionId)//根据流程定义IDHelloWorld:1:4
//		.processDefinitionIds(processDefinitionIds)//根据流程定义的IDS查询
//		.processDefinitionKey(processDefinitionKey)//根据流程定义的的key查询
//		.processDefinitionKeyLike(processDefinitionKeyLike)//根据流程定义的的key模糊查询
//		.processDefinitionName(processDefinitionName)//根据流程定义的名称查询
//		.processDefinitionNameLike(processDefinitionNameLike)//根据流程定义的名称模糊查询
//		.processDefinitionResourceName(resourceName)//根据流程图的BPMN文件名查询
//		.processDefinitionResourceNameLike(resourceNameLike)//根据流程图的BPMN文件名模糊查询
//		.processDefinitionVersion(processDefinitionVersion)//根据流程定义的版本查询
//		.processDefinitionVersionGreaterThan(processDefinitionVersion)//version>num
//		.processDefinitionVersionGreaterThanOrEquals(processDefinitionVersion)//version>=num
//		.processDefinitionVersionLowerThan(processDefinitionVersion)//version<num
//		.processDefinitionVersionLowerThanOrEquals(processDefinitionVersion)//version<=num
		//排序
//		.orderByDeploymentId()
//		.orderByProcessDefinitionId()
//		.orderByProcessDefinitionKey()
//		.orderByProcessDefinitionName()
//		.orderByProcessDefinitionVersion()
		//结果集
		.list();
//		.listPage(firstResult, maxResults)\
//		.count()
//		.singleResult()
		if(null!=list&&list.size()>0) {
			for (ProcessDefinition pd : list) {
				System.out.println("流程定义ID:"+pd.getId());
				System.out.println("流程部署ID:"+pd.getDeploymentId());
				System.out.println("流程定义KEY:"+pd.getKey());
				System.out.println("流程定义的名称:"+pd.getName());
				System.out.println("流程定义的bpmn文件名:"+pd.getResourceName());//bpmn的name
				System.out.println("流程图片名:"+pd.getDiagramResourceName());//png的name
				System.out.println("流程定义的版本号:"+pd.getVersion());
				System.out.println("##################");
			}
		}
		
	}

删除流程定义信息

	/**
	 * 删除流程定义
	 */
	@Test
	public void deleteProcessDef() {
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		String deploymentId="2501";
		//根据流程部署id删除流程定义 如果当前id的流程正在执行,那么会报错
		//repositoryService.deleteDeployment(deploymentId);
		//根据流程部署id删除删除流程定义 如果当前id的流程正在执行,会把正在执行的流程数据删除 act_ru_*和act_hi_*表里面的数据
		repositoryService.deleteDeployment(deploymentId, true);
//		repositoryService.deleteDeploymentCascade(deploymentId);==repositoryService.deleteDeployment(deploymentId, true);
		System.out.println("删除成功");
	}

 修改流程定义信息

修改流程图之后重新部署,只要key不变,它的版本号就会+1

查询流程图

	/**
	 * 查询流程图  根据流程定义ID
	 */
	@Test
	public void viewProcessImg() {
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		String processDefinitionId="HelloWorld:1:4";
		InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId);
		
		File file=new File("d:/HelloWorld.png");
		try {
			BufferedOutputStream outputStream=new BufferedOutputStream(new FileOutputStream(file));
			int len=0;
			byte[] b=new byte[1024];
			while((len=inputStream.read(b))!=-1) {
				outputStream.write(b, 0, len);
				outputStream.flush();
			}
			outputStream.close();
			inputStream.close();
			System.out.println("查询成功");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 查询流程图  根据流流程部署ID
	 */
	@Test
	public void viewProcessImg2() {
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		//根据流程部署ID查询流程定义对象
		String deploymentId="1";
		ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
		//从流程定义对象里面查询出流程定义ID
		String processDefinitionId=processDefinition.getId();
		InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId);
		
		File file=new File("d:/"+processDefinition.getDiagramResourceName());
		try {
			BufferedOutputStream outputStream=new BufferedOutputStream(new FileOutputStream(file));
			int len=0;
			byte[] b=new byte[1024];
			while((len=inputStream.read(b))!=-1) {
				outputStream.write(b, 0, len);
				outputStream.flush();
			}
			outputStream.close();
			inputStream.close();
			System.out.println("查询成功");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

附加功能:查询最新版本的流程定义


	/**
	 * 查询最新的流程定义
	 */
	@Test
	public void queryNewProcessDef() {
		Map<String, ProcessDefinition> map = new HashMap<>();

		// 查询所有的流程定义根据版本号升序
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
				.orderByProcessDefinitionVersion().asc().list();
		if(null!=list&&list.size()>0) {
			for (ProcessDefinition pd : list) {
				map.put(pd.getKey(), pd);
			}
		}
		//循环map集合
		Collection<ProcessDefinition> values = map.values();
		for (ProcessDefinition pd : values) {
			System.out.println("流程定义ID:" + pd.getId());
			System.out.println("流程部署ID:" + pd.getDeploymentId());
			System.out.println("流程定义KEY:" + pd.getKey());
			System.out.println("流程定义的名称:" + pd.getName());
			System.out.println("流程定义的bpmn文件名:" + pd.getResourceName());// bpmn的name
			System.out.println("流程图片名:" + pd.getDiagramResourceName());// png的name
			System.out.println("流程定义的版本号:" + pd.getVersion());
			System.out.println("##################");
		}
	}

附加功能:删除流程定义(删除key相同的所有不同版本的流程定义)

已知key


	/**
	 * 已知key 附加功能:删除流程定义(删除key相同的所有不同版本的流程定义)
	 */
	public void deleteAllSameVersion() {
		String processDefinitionKey = "HelloWorld";
		RepositoryService repositoryService = this.processEngine.getRepositoryService();
		// 根据流程定义的key查询流程集合
		List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
				.processDefinitionKey(processDefinitionKey).list();

		if (null != list && list.size() > 0) {
			for (ProcessDefinition pd : list) {
				repositoryService.deleteDeployment(pd.getDeploymentId(), true);

			}
		}

	}

 

 

おすすめ

転載: blog.csdn.net/weixin_43075758/article/details/116264000