工作流的概念

工作流(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。

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

  1. JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成

    管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...

  2. kafka详解及集群环境搭建

    一.kafka详解 安装包下载地址:https://download.csdn.net/download/weixin_45894220/87020758 1.1Kafka是什么? 1.Kafka是一 ...

  3. 手动angular2环境搭建_详解.Net Core + Angular2 环境搭建

    本文介绍了.Net Core + Angular2 环境搭建,具体如下: 环境搭建: 1)node.js版本>5.0,NPM版本>3.0,TypeScript版本>2.0(全装最新版 ...

  4. 2W 字详解 Redis 集群环境搭建实践

    点击上方 "终端研发部"关注, 星标或置顶一起成长 本文是Redis集群学习的实践总结(基于Redis 6.0+),详细介绍逐步搭建Redis集群环境的过程,并完成集群伸缩的实践. ...

  5. JavaWeb中filter的详解及应用案例

    JavaWeb中filter的详解及应用案例 转载自:http://www.cnblogs.com/vanl/p/5742501.html 一:Filter介绍 Filter可认为是Servlet的一 ...

  6. 微信小程序开发登录界面mysql_微信小程序 欢迎界面开发的实例详解

    微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将演示如何通过微信小程序实现一个欢迎界面. 下面将会按照以下的顺序介绍: 布局的实现 逻辑的实现 样式的实现 1.布局的实现 整个布局 ...

  7. java web编码详解_java web 开发 编码问题详解

    java web 开发 编码问题详解 浏览器 IE/FireFox ------------->Servlet容器-------------------------->显示页面 编码   ...

  8. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  9. STM32开发 -- 低功耗模式详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...

最新文章

  1. 一文读懂:GoogleNet的Inception从v1到v4的演变
  2. Windows7 apache启动失败的解决方法
  3. HDU - 2050 折线分割平面(规律题)
  4. 无法解析的外部符号的几种可能(lib方面的)(还有dll方面的,不在本文中)...
  5. 使用vue-CLI构建vue工程项目
  6. 你的第一个Django程序
  7. 为什么高手离不了Linux系统?我想这就是理由!
  8. 技校毕业是什么学历_初中毕业上技校学什么专业好
  9. linux用户管理和文件权限
  10. 1.Sigar介绍和配置
  11. python3 使用sorted 实现倒序
  12. php毕业论文选题系统,基于THINKPHP的毕业论文选题系统的设计
  13. 邮件签名——html模板
  14. List集合中根据相同属性的对象合并计算
  15. 微信公众平台编辑器可收藏、使用模版了
  16. 数据分析,如何支持管理层决策
  17. Android 自定义Dialog 里面有EditText控件点击关闭输入法失效的问题
  18. 微信公众号开发——关键词自动回复
  19. 苹果CMS电影站新手搭建教程
  20. 回顾 2022 年 — 回顾 Elastic 这一年

热门文章

  1. 谷歌浏览器在线安装下载的安装文件在哪里?
  2. 基于Spark的电影推荐系统(推荐系统~5)
  3. 键盘与显示实验程序c语言,51单片机按键控制数码管程序
  4. 将多个annotation xml文件转换为多个annotation txt文件
  5. WPF框架嵌套用户控件,显示与切换(详细,代码复制可用)
  6. C语言 - 制作一个可以容纳一千人的本地通讯录
  7. 微信小程序更新webview页面的三种方法
  8. 埃里克贝里奇_【双语分享】为什么科技需要人文学科?
  9. 汇编中参数的传递和堆栈修正
  10. ADDS, DHCP建立