工作流学习——Activiti整体认识二步曲

前言

在上一篇文章中我们将工作流的相关概念、activiti的前世今生、activiti与jbpm的比较进行学习,这篇文章我们正式进行activiti的学习,activiti的整个学习我们主要通过例子的形式来理解。今天我们主要是准备下activiti的环境,在数据库中创建activiti默认的23张表以及activiti核心对象ProcessEngine最后是一个activiti的简单demo。

环境准备

相关软件及版本:

jdk版本:Jdk1.8

IDE:eclipse

数据库:mysql

Activiti:5.13

    eclipse中安装流程设计器插件:

eclipse打开help->install new software,单击add:

Name: Activiti BPMN2.0 designer

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

进行安装即可。

    引入jar包:

${Activiti_HOME}/install/activiti-5.13/libs(activiti相关包)+mysql对应驱动包(mysql-connector-java.jar)

jar包引入完毕后,我们环境就准备的差不多了,往下我们就该创建我们activiti数据库默认的表了。

创建activiti

在activiti中,相对于前身jbpm基础上又额外多了5张表,所有现在的activiti框架默认提供了23张表。所以第一步我们就来创建这23张表。

方法1:使用代码来创建activiti工作流的表

方法1:使用代码来创建activiti工作流的表

// 使用代码创建工作流需要的23张表
@Test
public void createTable() {
	// 工作流引擎的全部配置
	ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
			.createStandaloneProcessEngineConfiguration();

	// 链接数据的配置
	processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
	processEngineConfiguration
			.setJdbcUrl("jdbc:mysql://localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8");
	processEngineConfiguration.setJdbcUsername("root");
	processEngineConfiguration.setJdbcPassword("123456");

	/*
	 * public static final String DB_SCHEMA_UPDATE_FALSE = "false";
	 * 不能自动创建表,需要表存在 public static final String DB_SCHEMA_UPDATE_CREATE_DROP
	 * = "create-drop"; 先删除表再创建表 public static final String
	 * DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自动创建表
	 */
	//如果表不存在,自动创建表
	processEngineConfiguration
			.setDatabaseSchemaUpdate(processEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
	// 工作流的核心对象,ProcessEnginee对象
	ProcessEngine processEngine = processEngineConfiguration
			.buildProcessEngine();
	System.out.println(processEngine);

}

代码执行完毕,我们通过navicat查看数据库会发现,创建了一个新的数据库activiti1,并且还有23张表。

方式2:使用配置文件来创建activiti的表

在类路径下创建Activiti.cfg.xml文件,文件内容为:

<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: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-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<!-- 连接数据的配置 -->
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl"
			value="jdbc:mysql://localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"></property>
		<property name="jdbcUsername" value="root"></property>
		<property name="jdbcPassword" value="123456"></property>
		<!-- 没有表创建表 -->
		<property name="databaseSchemaUpdate" value="true"></property>
	</bean>

</beans>

通过代码来加载配置文件中内容:

/**
 * 使用配置文件来创建数据库中的表
 */
@Test
public void createTable_2() {
	//通过让工作流引擎的全部配置对象来执行配置文件中的内容来创建流程引擎对象
	ProcessEngine processEngine = ProcessEngineConfiguration
			.createProcessEngineConfigurationFromResource(
					"activiti.cfg.xml").buildProcessEngine();
	System.out.println("processEngine" + processEngine);
}

运行产生的结果与第一种是一样的,其中这一种通过配置文件的方式是用的是比第一种多的。

连接数据库url写法:

无论是通过代码还是通过xml文件来创建工作流的表,里面都涉及到一个知识点就是mysql的url的写法,我们进行下小结:

#autoReconnect当数据库连接丢失时是否自动连接,取值true/false 缺省为false

#maxReconnects如果autoReconnect为true,此参数为重试次数,缺省为3次

#initialTimeout如果autoReconnect为true,此参数为重新连接前等待的秒数缺省为2

#maxRows设置查询时返回的行数,0表示全部缺省为0

#useUnicode是否使用unicode输出,true/false缺省为false

#characterEncoding如果useUnicode,该参数制定encoding类型,建议使用utf8缺省为无

#createDatabaseIfNotExist当JDBC连接指定数据库,如果此数据库不存在,此参数值为true时,则自动创建此数据库

下面是一个url的例子:

jdbc:mysql://localhost:3306/ourmysql?
createDatabaseIfNotExist=true&
amp;useUnicode=true&
amp;characterEncoding=utf8&
amp;autoReconnect=true&
amp;useLocalSessionState=true

核心对象ProcessEngine

数据库里的表创建完毕,接下来我们讲述activiti里面的核心对象ProcessEngine。

ProcessEngine类,一般称为流程引擎类,没错,这个流程引擎就是我们上一篇文章中提到的流程引擎,它是activiti中最核心的类,并且这个类是线程安全的,所有的线程和请求都可以使用同一个ProcessEngine对象,其它常用类几乎也都是由它而来的。

得到ProcessEngine对象:

    方式1:使用classpath根目录下的默认配置文件jbpm.cfg.xml创建一个单例的ProcessEngine

ProcessEngineprocessEngine = ProcessEngines.getDefaultProcessEngine();

方式2:指定其他位置:配置文件,如src根目录config包下的my-jbpm-cfg.xml。

ProcessEngineprocessEngine = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource(
"config/my-jbpm-cfg.xml").buildProcessEngine();

得到各个Service

RepositoryService

RepositoryService是管理流程定义的仓库服务的接口。

RepositoryServicerepositoryService = processEngine.getRepositoryService();

RuntimeService

RuntimeService是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息,如执行管理,包括启动、推进、删除流程实例等操作。

RuntimeServiceruntimeService = processEngine.getRuntimeService();

TaskService

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

TaskServicetaskservice = processEngine.getTaskService();

HistoryService

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

HistoryServicehistoryService = processEngine.getHistoryService();

到这里关于activiti核心对象ProcessEngine先介绍这么多,下面看我们的小的helloworld的demo。

Demo流程

第一步流程设计画出业务流程

我们通过流程设计器就可以拖拖拽拽出我们的流程,同时设置相关属性,保存后会生成两个文件,分别是helloworld.bpmn和helloworld.png.

这是我们的流程图:

第二步部署流程定义

/**
 * 部署流程定义
 */
@Test
public void deploymentProcessDefinition() {
	//创建核心引擎对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的service
			.createDeployment()// 创建一个部署对象
			.name("helloworld入门程序")// 添加部署的名称
			.addClasspathResource("diagrams/helloworld.bpmn")// classpath的资源中加载,一次只能加载
																// 一个文件
			.addClasspathResource("diagrams/helloworld.png")// classpath的资源中加载,一次只能加载
															// 一个文件
			.deploy();// 完成部署
	System.out.println("部署ID:" + deployment.getId());
	System.out.println("部署名称:" + deployment.getName());
}

运行结果:

部署ID:1

部署名称:helloworld入门程序

第三步
启动流程实例

/**
 * 启动流程实例
 */
@Test
public void startProcessInstance() {
	// 流程定义的key
	String processDefinitionKey = "HelloWorld";
	ProcessInstance pi = processEngine.getRuntimeService()// 于正在执行的流程实例和执行对象相关的Service
			.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应hellworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
	System.out.println("流程实例ID:" + pi.getId());// 流程实例ID 101
	System.out.println("流程定义ID:" + pi.getProcessDefinitionId()); // 流程定义ID HelloWorld:1:4

运行结果为:

流程实例ID:101

流程定义ID:HelloWorld:1:4

第四步查询当前办理人的个人任务

	/**
	 * 查询当前人的个人任务
	 */
	@Test
	public void findMyPersonTask() {
		String assignee = "张三";
		List<Task> list = processEngine.getTaskService()// 与正在执行的认为管理相关的Service
				.createTaskQuery()// 创建任务查询对象
				.taskAssignee(assignee)// 指定个人认为查询,指定办理人
				.list();

		if (list != null && list.size() > 0) {
			for (Task task:list) {
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间"+task);
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
				System.out.println("#################################");
			}
		}
	}

运行结果:

任务ID:104

任务名称:提交申请

任务的创建时间Task[id=104,name=提交申请]

任务的办理人:张三

流程实例ID:101

执行对象ID:101

流程定义ID:HelloWorld:1:4

#################################

第五步
完成任务

/**
 * 完成我的任务
 */
@Test
public void completeMyPersonTask(){
	//任务Id
	String taskId="104";
	processEngine.getTaskService()//与正在执行的认为管理相关的Service
			.complete(taskId);
	System.out.println("完成任务:任务ID:"+taskId);

}

运行结果:

完成任务:任务ID:104

到这里我们就完成了一个简单的helloworld,从画一个流程图、到部署流程定义、启动流程实例、查询当前办理人的任务、完成当前的任务,从第二步开始每一步在数据库中都会有相应的记录进行添加、删除、更新,我们运行产生的结果也都是从数据库中查出来的记录,关于每一步对应与数据库中怎样的变化,我们会在后续的文章继续介绍。

后记

我们本篇文章主要讲述了activiti的环境准备包含各个软件的版本和安装流程设计器,接下来我们讲解了两种方式来创建activiti的23张表,还夹杂着一个数据库连接url的写法,接下来是activiti核心对象ProcessEngine,以及通过ProcessEngine获取相关的Service,最后通过一个特别简单的小demo来让大家对部署流程定义、启动流程实例、查询当前任务、完成当前任务这些步骤有一个感性的认识,详细的内容我们会在后续文章继续介绍。

时间: 2025-01-06 21:24:11

工作流学习——Activiti整体认识二步曲的相关文章

工作流学习——Activiti整体认识二步曲 (zhuan)

http://blog.csdn.net/zwk626542417/article/details/46594505 *********************************************** 一.前言 在上一篇文章中我们将工作流的相关概念.activiti的前世今生.activiti与jbpm的比较进行学习,这篇文章我们正式进行activiti的学习,activiti的整个学习我们主要通过例子的形式来理解.今天我们主要是准备下activiti的环境,在数据库中创建activ

工作流学习——Activiti流程变量五步曲

一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们平常理解的变量是一样的,只不过是用在了我们activiti中,所以称为流程变量,流程变量在整个工作流扮演着很重要的角色. 例如,请假流程中有请假天数.请假原因等一些参数都是流程变量使用的范围,流程变量的作用域范围是只对应一个流程实例.也就是说各个流程实例的流程变量是不互相影响的.流程实例结束完成以后流程变量还保存在数据库中(存放在流程变量的历史表中

工作流学习——Activiti流程定义管理三步曲

一.前言 在上一篇文章我们通过一个小demo对Activiti进行了宏观的介绍,让大家对Activiti有了整体的认识,这篇文章我们来学习具体的流程定义管理的CRUD. 二.正文 流程定义是什么 ProcessDefinition(流程定义)就是一个流程的步骤说明,比如我们接下来要说的这个流程,申请人王三发起提交申请,李四作为部门经理进行审批,审批完成后,此申请到达下一级总经理王五,进行审批.就这么整个流程说明其实就是流程定义,不过在Activiti中整个流程定义是以helloworld.bpm

工作流学习——Activiti流程定义管理三步曲 (zhuan)

http://blog.csdn.net/zwk626542417/article/details/46602419 **************************************************************** 一.前言 在上一篇文章我们通过一个小demo对Activiti进行了宏观的介绍,让大家对Activiti有了整体的认识,这篇文章我们来学习具体的流程定义管理的CRUD. 二.正文 流程定义是什么 ProcessDefinition(流程定义)就是一个流

中间件学习——二步曲(分类)

上一篇文章我们介绍了中间件的由来.定义和作用,这篇文章我们继续中间件的学习,中间件的产品种类很多,根据中间件在系统中所起的作用和采用的技术不同,我们将中间件进行了分类,我们今天就详细学习下中间件具体知识. 分类 中间件分为远程过程调用中间件.数据访问中间件.消息中间件.事务(交易)处理中间件.分布式对象中间件. 远程过程调用中间件(RPC, Remote Procedure Call) 我们一个一个来学习,首先来学习的是远程过程调用中间件,远程过程调用就是程序和程序之间的通信,就是客户端应用程序

工作流学习——Activiti流程实例、任务管理四步曲

一.前言 上一篇文章中我们将Activiti流程定义管理的知识进行了介绍,这篇文章我们继续Activiti流程实例和任务管理的学习. 二.正文 流程实例(ProcessInstance ) 流程实例(ProcessInstance)和上一篇文章中流程定义(ProcessDefinition)的关系,与类和实例对象的关系有点像,ProcessDefinition是整个流程步骤的说明而ProcessInstance就是指流程定义从开始到结束的那个最大的执行路线. 执行对象(Execution) 提到

跟我学Java反射——二步曲

上一篇文章我们已经将反射的基本知识和class类以及类的加载器进行了介绍,在上一篇我们还学习了四种得到Class类对象的方式,但是有了class对象我们能做些什么呢,学习完这篇文章,就可以得到答案了. 获取类的完整结构 这篇文章我们主要通过demo来学习,我先将demo需要用到的代码进行简单介绍. 一个接口MyInterface代码: package com.tgb.reflect.common; import java.io.Serializable; public interface MyI

HBASE 0.98版本安装,二步曲:安装HADOOP到集群

1.准备4台服务器 一台作为namenode 192.168.137.101 hd1 三台作为datanode 192.168.137.102 hd2192.168.137.103 hd3192.168.137.104 hd4 2.拉平所有服务器的时间 使用ntpdate 略 3.配置多机互信 略 4.解压hadoop tar zxvf hadoop-2.2.0.tar.gz 5.移动hadoop到相应位置 mv hadoop-2.2.0 /home/hadoop/hadoop 6.在namen

工作流学习——重要概念扫盲篇一步曲

前言 从本篇文章我们开始介绍工作流框架activiti的相关知识,不过在介绍activiti的知识之前,我们很有必要对工作流的一些基本概念进行了解. 工作流重要概念 Workflow Workflow(工作流)是"业务过程的部分或整体在计算机应用环境下的自动化,是对工作流程及其各操作步骤之间业务规则的抽象.概括描述",它主要解决的是"使在多个参与者之间按照一种提前定义好的规则流程来传递与执行文档.信息或任务的过程,让这个过程可以自动进行或者部分自动执行,从而完成预期的业务目标