JAVAWEB开发之工作流详解(一)——Activiti的环境搭建、插件安装、核心API

工作流的概念

工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
工作流管理系统(Workflow Management System, WfMS)是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流逻辑进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。
工作流管理联盟(WfMC,Workflow Management Coalition)给出的关于工作流管理系统的定义是:工作流管理系统是一个软件系统,它通过执行经过计算的流程定义去支持一批专门设定的业务流程。工作流管理系统被用来定义、管理、和执行工作流程。
工作流管理系统的目标:管理工作的流程以确保工作在正确的时间被期望的人员所执行在自动化进行的业务过程中插入人工的执行。

常见的工作流框架

Activity5.1.3、JBPM4.4、OSWorkFlow、WorkFlow
工作流框架的底层需要有数据库提供支持,activiti5.13版本,有23张表。JBPM4.4框架底层有数据库支持,18张表。JBPM底层使用hibernate操作数据库。Activiti框架底层使用的mybatis操作数据库。

Activiti介绍

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

工作流引擎

工作流引擎是Activiti工作的核心。负责生成流程运行时的各种实例以及数据、监控和管理流程的运行。

BPMN2.0*

业务流程建模与标注(Business Process Model And Notation, BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)

数据库

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。第二部分表示用途的两个字母标识。用途也和服务的API对应。
(1) ACT_RE_*:'RE' 表示repository。这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
(2) ACT_RU_*:'RU' 表示runtime。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。
(3) ACT_ID_*:'ID' 表示identity。这些表包含身份信息,比如用户,组等等。
(4) ACT_HI_*:'HI' 表示history。这些表包含历史数据,比如历史流程实例,变量,任务等等。
(5) ACT_GE_*:通用数据,用于不同场景下。

资源库流程规则表

(1) act_re_deployment  部署信息表。
(2) act_re_model           流程设计模型部署表。
(3) act_re_procdef         流程定义数据表。

运行时数据库表

(1) act_ru_execution    运行时流程执行实例表。
(2) act_ru_identitylink   运行时流程人员表,主要存储任务节点与参与者的相关信息。
(3) act_ru_task             运行时节点表
(4) act_ru_variable       运行时流程变量数据表

历史数据库表

(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           历史变量表
注意:inst 是instance 实例 的缩写

组织机构表

(1) act_id_group            用户组信息表
(2) act_id_info               用户扩展信息表
(3) act_id_membership 用户与用户组对应的信息表
(4) act_id_user              用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议自己开发一套,组件自带的功能太简单,很难满足项目中的很多需求。

通用数据表

(1) act_ge_bytearray   二进制数据表
(2) act_ge_property    属性数据表中存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。

activiti.cfg.xml

Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。
定义数据库配置参数:
jdbcUrl: 数据库的JDBC URL。
jdbcDriver: 对应不同数据库类型的驱动。
jdbcUsername: 连接数据库的用户名。
jdbcPassword: 连接数据库的密码。
基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池。 下面的参数可以用来配置连接池(来自MyBatis参数):
jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。
jdbcMaxCheckoutTime: 连接被取出使用的最长时间,超过时间会被强制回收。 默认为20000(20秒)。
jdbcMaxWaitTime: 这是一个底层配置,让连接池可以在长时间无法获得连接时, 打印一条日志,并重新尝试获取一个连接。(避免因为错误配置导致沉默的操作失败)。 默认为20000(20秒)。
示例数据库配置:
<!-- 配置流程引擎创建工具参数 -->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<!-- 数据库连接配置,默认使用MyBatis连接池 -->
	<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/>
	<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
	<property name="jdbcUsername" value="root"/>
	<property name="jdbcPassword" value="root"/>
	<!-- 
		databaseSchemaUpdate: 设置流程引擎启动和关闭时如何处理数据库表
		false:(默认) 检查数据库的版本和依赖库的版本,如果版本不匹配就抛出异常。
		true:构建流程引擎时,执行检查,如果需要就执行更新,如果不存在就创建
		create-drop:构建流程引擎时创建数据库表,关闭流程引擎时就删除这些表
	 -->
	 <property name="databaseSchemaUpdate" value="true"/>
	 <!-- 是否启动任务调用 -->
	 <property name="jobExecutorActivate" value="false"/>
	 <!-- 邮件服务器配置 -->
	 <property name="mailServerHost" value=""/> <!-- 邮件服务器地址 -->
	 <property name="mailServerPort" value=""/> <!-- 邮件服务器端口 -->
	 <property name="mailServerUsername" value=""/> <!-- 邮件服务器的用户名 -->
	 <property name="mailServerPassword" value=""/>
</bean>
也可以使用第三方的连接池 比如Apache的DBCP连接池
<!-- 方式二:使用别的数据源 -->
<!-- 配置DBCP连接池基本参数 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
	<property name="username" value="root"/>
	<property name="password" value="root"/>
</bean>

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<!-- 配置第三方连接池 -->
	<property name="dataSource" ref="dataSource"/>
	<!-- 
		databaseSchemaUpdate: 设置流程引擎启动和关闭时如何处理数据库表
		false:(默认) 检查数据库的版本和依赖库的版本,如果版本不匹配就抛出异常。
		true:构建流程引擎时,执行检查,如果需要就执行更新,如果不存在就创建
		create-drop:构建流程引擎时创建数据库表,关闭流程引擎时就删除这些表
	 -->
	 <property name="databaseSchemaUpdate" value="true"/>
	 <!-- 是否启动任务调用 -->
	 <property name="jobExecutorActivate" value="false"/>
	 <!-- 邮件服务器配置 -->
	 <property name="mailServerHost" value=""/> <!-- 邮件服务器地址 -->
	 <property name="mailServerPort" value=""/> <!-- 邮件服务器端口 -->
	 <property name="mailServerUsername" value=""/> <!-- 邮件服务器的用户名 -->
	 <property name="mailServerPassword" value=""/>
</bean>

log4j.properties

日志配置文件

准备环境

activiti5 软件环境

(1)JDK1.6或者更高版本
(2)支持的数据库有:h2, mysql, oracle, postgres, mssql, db2等。
(3)支持activiti5运行的jar包
(4)开发环境为Eclipse3.7或者以上版本,myeclipse为8.6版本

相关资源下载

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)Eclipse3.7或者MyEclipse8.6也可以到相应的网站上获得下载。

安装流程设计器(eclipse插件)

在有网络的情况下,安装流程设计器步骤如下:
(1)打开 Help -> Install New Software
(2)在如下的Install界面,点击Add按钮

配置新装插件的地址和名称
(3)然后填入下列字段
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/
如图所示:

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

(5)点击复选框
在Detail部分记得选中 "Contact all updates sites.." , 因为它会检查所有当前安装所需要的插件并可以被Eclipse下载.
(6)安装完以后,点击新建工程new->Other…打开面板,如果看到下图内容:

注意:MyEclipse是无法安装此插件的,即使安装成功 也无法保存图片
另一种方法直接将下载好的activiti-eclipse-plugin.zip解压后 放入Eclipse安装目录的dropins文件夹 重启即可。

流程设计器的使用说明

打开菜单Windows->Preferences->Activiti->Save下流程流程图片的生成方式:

虽然流程引擎在单独部署bpmn文件时会自动生成图片,但在实际开发过程中,自动生成的图片会导致和BPMN中的坐标有出入,在实际项目中展示流程当前位置图会有问题。
所在完成以上配置后,会由我们自己来管理流程图片。在发布流程时把流程规则文件和流程图片一起上传就行了。

准备Activiti5开发环境

添加Activiti5的jar包

在activiti-5.16.1->wars目录下是一些示例项目,解压activiti-rest项目,导入activiti-rest目录中WEB-INF\lib下所有包。添加到classpath中。
由于我使用的是Mysql数据库,Mysql数据库的链接驱动Activiti官方包中并没有提供,需要导入。手动导入mysql-connector-java.jar,添加到classpath

初始化数据库

方式一:使用Activiti提供的建表语句


方式二:使用Activiti的自动建表功能

(1)不使用配置文件(不建议采用)
/**
 * 使用框架提供的自动建表功能(不提供配置文件)
 */
@Test
public void testDb1() {
	// 创建Activiti流程引擎配置对象
	ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
	
	// 配置数据库驱动
	cfg.setJdbcDriver("com.mysql.jdbc.Driver");
	// 配置数据库连接
	cfg.setJdbcUrl("jdbc:mysql://localhost:3306/activiti?createDatabaseIfNotExist=true");
	// 配置用户名
	cfg.setJdbcUsername("root");
	// 配置数据库密码
	cfg.setJdbcPassword("root");
	/**
	 * 设置自动建表
	 */
	cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
	// 根据引擎配置对象创建流程引擎
	ProcessEngine processEngine = cfg.buildProcessEngine();
}
在Activiti中,在创建核心的流程引擎对象时会自动建表。如果程序正常执行,mysql会自动建库,然后创建23张表。
(2)使用指定的配置文件
在Actiiti5中定制流程必定会操作到数据库,如果都像上面写一大段代码会非常麻烦,所以我们可以把数据库连接配置写入配置文件。
在Activiti5的官方示例中并没有现成的配置文件,所以先得找到activiti-rest\WEB-INF\classes下有:
1.activiti-context.xml : 一个类似spring结构的配置文件,清空内容后改名为activiti.cfg.xml,用来做流程引擎的相关配置。按照上面代码配置ProcessEngineConfiguration对象,主要定义数据库的连接配置和建表策略,配置文件代码如下:
<!-- 配置流程引擎配置对象 -->
<bean id="processEngineConfiguration"
	class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
	<property name="jdbcUrl" value="jdbc:mysql:///activiti" />
	<property name="jdbcUsername" value="root" />
	<property name="jdbcPassword" value="root" />
	<property name="databaseSchemaUpdate" value="true" />
</bean>
Java代码如下:
/**
 * 使用框架提供的自动建表功能(使用配置文件)--可以从框架提供的例子中获取
 */
@Test
public void testDb2() {
	String resource = "activiti-context.xml";// 配置文件名称
	String beanName = "processEngineConfiguration";// 配置id值
	ProcessEngineConfiguration conf = ProcessEngineConfiguration
			.createProcessEngineConfigurationFromResource(resource,
					beanName);
	ProcessEngine processEngine = conf.buildProcessEngine();
}
createProcessEngineConfigurationFromResource的参数值为我们添加的配置文件activiti.cfg.xml的名称,执行java代码,流程引擎对象创建成功运行后数据库会自动建表。
log4j.properties 日志配置文件
log4j提供的日志级别:Fatal error warn info debug trace
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout
把两个文件放入resource目录下即可。
注意:数据库编码要指定为utf8
(3)使用配置文件(使用默认配置)
要求配置文件的名称必须为activiti-context.xml或者activiti.cfg.xml 配置的信息必须如下所示(Bean的id不能改变):
<!-- 配置流程引擎配置对象 -->
<bean id="processEngineConfiguration"
	class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
	<property name="jdbcUrl" value="jdbc:mysql:///activiti" />
	<property name="jdbcUsername" value="root" />
	<property name="jdbcPassword" value="root" />
	<property name="databaseSchemaUpdate" value="true" />
</bean>

<!-- 配置一个流程引擎工程bean,用于创建流程引擎对象 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
	<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
获取流程引擎的代码:
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

核心API

ProcessEngine

(1)在Activiti中最核心的类,其它的类都是由此类获取的
(2)产生方式:ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
有好多种创建ProcessEngine(流程引擎)的方式,而此中方式简化很多,调用ProcessEngines的getDefaultProcessEngine方法时会自动加载classpath下名为activiti-context.xml或activiti.cfg.xml配置文件。
(3)可以产生RespositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
(4)可以产生RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
(5)可以产生TaskService
TaskService taskService = processEngine.getTaskService();
各个Service的作用:
Respository:管理流程定义
RuntimeService:执行管理,包括启动、推进、删除流程实例等操作。
TaskService:任务管理
HistoryService:历史管理(执行完数据的管理)
IdentityService:组织结构管理
FormService:一个可选服务,任务表单管理

RepositoryService

是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片。
(1)产生方式
RepositoryService repositoryService = processEngine.getRepositoryService();
(2)可以产生DeploymentBuilder,用来定义流程部署的相关参数。
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
(3)删除流程定义
repositoryService.deleteDeployment(deploymentId);

RuntimeService

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

TaskService

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

ProcessDefinition

流程定义类。可以从这里获得资源文件等。

ProcessInstance

代表流程定义的执行实例。例如企业某员工请了一周的假期,那么他就必须发出一个流程实例的申请。一个流程实例包括了所有的运动节点。我们可以利用这个对象来了解当前流程实例的进度信息。
如下图是ProcessInstance的源代码:

从源代码中可以看出ProcessInstance就是Execution的子接口。也可以说ProcessInstance就是Execution。但是在实际意义上是有所区别的:

在单线流程中,如上图的贷款流程,ProcessInstance与Execution是一致的。

这个例子有一个特点:write money(汇钱)和archive(存档)是并发执行的。此时,总线路流程代表ProcessInstance,而分线路中的每个活动代表Execution。

Execution

Activiti用这个对象去描述流程执行的每一个节点,在没有并发的情况下,等同于ProcessInstance。


  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值