Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表声明:表详细数据转载自 https://blog.csdn.net/hj7jay/article/details/51302829该博主对activiti数据模型做了很深的讲解一.框架结构二.初始化activit5框架的表执行测试类里的createTables方法packagecom.lpinfo.activiti.test;importorg.activiti.e…

大家好,又见面了,我是你们的朋友全栈君。

声明:表详细数据转载自 https://blog.csdn.net/hj7jay/article/details/51302829

该博主对activiti数据模型做了很深的讲解

一.框架结构

Activiti教程(五)activiti5初始化表和讲解表

二.初始化activit5框架的表 执行测试类里的createTables方法

package com.lpinfo.activiti.test;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;

public class ActivitiTest {
	
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

	@Test
	public void createTables(){
		ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
		processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
		processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/lpinfo-activiti?useUnicode=true&characterEncoding=utf8");
		processEngineConfiguration.setJdbcUsername("root");
		processEngineConfiguration.setJdbcPassword("root");
		processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP);
		processEngineConfiguration.buildProcessEngine();
	}
	/**
	 * ===配置 细信息
	 * getRepositoryService() //与流程定义和部署对象相关的Service
	 * createDeployment()  //创建一个部署对象
	 * name("helloworld入门程序")  //添加部署的名称
	 * addClasspathResource("diagrams/helloworld.bpmn") //从classpath的资源中加载,一次只能加载一个文件
	 * addClasspathResource("diagrams/helloworld.png") //从classpath的资源中加载,一次只能加载一个文件
	 * deploy() //完成部署
	 * ===操作的表
	 *  
	 * 
	 */
	@Test
	public void deploymentProcessDefinition(){
		Deployment deployment = processEngine.getRepositoryService()
						.createDeployment()
						.name("helloworld入门程序")
						.category("helloword")
						.addClasspathResource("diagrams/helloworld.bpmn")
						.addClasspathResource("diagrams/helloworld.png")
						.deploy();//完成部署
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署类别:"+deployment.getCategory());
		System.out.println("部署名称:"+deployment.getName());
	}
	
	
}

三.框架表讲解

1.框架表截图

Activiti教程(五)activiti5初始化表和讲解表

2.相关表讲解 

   Activiti工作流总共包含23张数据表,所有的表名默认以“ACT_”开头。

并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配。

u  ACT_GE_* : “GE”代表“General”(通用),用在各种情况下;

u  ACT_HI_* : “HI”代表“History”(历史),这些表中保存的都是历史数据,比如执行过的流程实例、变量、任务,等等。Activit默认提供了4种历史级别:

Ø  none: 不保存任何历史记录,可以提高系统性能;

Ø  activity:保存所有的流程实例、任务、活动信息;

Ø  audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;

Ø  full:最完整的历史记录,除了包含audit级别的信息之外还能保存详细,例如:流程变量。

对于几种级别根据对功能的要求选择,如果需要日后跟踪详细可以开启full。

u  ACT_ID_* : “ID”代表“Identity”(身份),这些表中保存的都是身份信息,如用户和组以及两者之间的关系。如果Activiti被集成在某一系统当中的话,这些表可以不用,可以直接使用现有系统中的用户或组信息;

u  ACT_RE_* : “RE”代表“Repository”(仓库),这些表中保存一些‘静态’信息,如流程定义和流程资源(如图片、规则等);

u  ACT_RU_* : “RU”代表“Runtime”(运行时),这些表中保存一些流程实例、用户任务、变量等的运行时数据。Activiti只保存流程实例在执行过程中的运行时数据,并且当流程结束后会立即移除这些数据,这是为了保证运行时表尽量的小并运行的足够快;
 

表名称 描述
一般 数据

ACT_GE_BYTEARRAY

通用的流程定义和流程资源 

ACT_GE_PROPERTY

系统相关属性 

     
流程定义

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

运行时变量表

     
组用户

ACT_ID_GROUP

身份信息-组信息

ACT_ID_INFO

身份信息-组信息

ACT_ID_MEMBERSHIP

身份信息-用户和组关系的中间表

ACT_ID_USER

身份信息-用户信息

     
历史记录

ACT_HI_ACTINST

历史的流程实例

ACT_HI_ATTACHMENT

历史的流程附件

ACT_HI_COMMENT

历史的说明性信息

ACT_HI_DETAIL

历史的流程运行中的细节信息

ACT_HI_IDENTITYLINK

历史的流程运行过程中用户关系

ACT_HI_PROCINST

历史的流程实例

ACT_HI_TASKINST

历史的任务实例

ACT_HI_VARINST

历史的流程运行中的变量信息

     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.各自表讲解

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

Activiti教程(五)activiti5初始化表和讲解表

2  Activiti中主要对象的关系
本节主要介绍在工作流中出现的几个对象及其之间的关系,以及在Activiti中各个对象是如何关联的。

在开始之前先看看下图,对整个对象结构有个了解,再结合实例详细介绍理解。

图1.Activiti中几个对象之间的关系

我们模拟一个请假的流程进行分析介绍,该流程主要包含以下几个步骤:

u  员工申请请假

u  部门领导审批

u  人事审批

u  员工销假

 

ProcessInstance对象

员工开始申请请假流程,通过runtimeService.startProcessInstance()方法启动,引擎会创建一个流程实例(ProcessInstance)。

简单来说流程实例就是根据一次(一条)业务数据用流程驱动的入口,两者之间是一对一的关系。流程引擎会创建一条数据到ACT_RU_EXECUTION表,同时也会根据history的级别决定是否查询相同的历史数据到ACT_HI_PROCINST表。

启动完流程之后业务和流程已经建立了关联关系,第一步结束。

启动流程和业务关联区别:

u 对于自定义表单来说启动的时候会传入businessKey作为业务和流程的关联属性

u 对于动态表单来说不需要使用businessKey关联,因为所有的数据都保存在引擎的表中

u 对于外部表单来说businessKey是可选的,但是一般不会为空,和自定义表单类似

 

Execution对象

对于初学者来说,最难理解的地方就是ProcessInstance与Execution之间的关系,要分两种情况说明。Execution的含义就是一个流程实例(ProcessInstance)具体要执行的过程对象。

不过在说明之前先声明两者的对象映射关系:

ProcessInstance(1)→ Execution(N),(其中N>=1)。

1)  值相等的情况:

除了在流程中启动的子流程之外,流程启动之后在表ACT_RU_EXECUTION中的字段ID_和PROC_INST_ID_字段值是相同的。

图2.ID_和PROC_INST_ID_相等

2)  值不相等的情况:

不相等的情况目前只会出现在子流程中(包含:嵌套、引入),例如一个购物流程中除了下单、出库节点之外可能还有一个付款子流程,在实际企业应用中付款流程通常是作为公用的,所以使用子流程作为主流程(购物流程)的一部分。

当任务到达子流程时引擎会自动创建一个付款流程,但是这个流程有一个特殊的地方,在数据库可以直观体现,如下图。

图3.ID_和PROC_INST_ID_不相等

上图中有两条数据,第二条数据(嵌入的子流程)的PARENT_ID_等于第一条数据的ID_和PROC_INST_ID_,并且两条数据的PROC_INST_ID_相同。

上图中还有一点特殊的地方,字段IS_ACTIVE_的值分别是0和1,说明正在执行子流程主流程挂起。

 

Task对象

前面说了ProcessInstance和业务是一对一关联的,和业务数据最亲密;而Task则和用户最亲密的(UserTask),用户每天的待办事项就是一个个的Task对象。

从图1中看得出Execution和Task是一对一关系,Task可以是任何类型的Task实现,可以是用户任务(UserTask)、Java服务(JavaServiceTask)等,在实际流程运行中只不过面向对象不同,用户任务(UserTask)需要有人为参与完成(complete),Java服务需要由系统自动执行(execution)。

图4. 表ACT_RU_TASK

Task是在流程定义中看到的最大单位,每当一个Task完成的时候引擎会把当前的任务移动到历史中,然后插入下一个任务插入到表ACT_RU_TASK中。结合请假流程来说就是让用户点击“完成”按钮提交当前任务是的动作,引擎自动根据任务的顺序流或者排他分支判断走向。

 

HistoryActivity(历史活动)

图5. 表ACT_HI_ACTINST

 

Activity包含了流程中所有的活动数据,例如开始事件(图5表中的第1条数据)、各种分支(排他分支、并行分支等,图5表中的第2条数据)、以及刚刚提到的Task执行记录(如图5表中的第3、4条数据)。

有些人认为Activity和Task是多对一关系,其实不是,从上图中可以看出来根本没有Task相关的字段。

结合请假流程来说,如Task中提到的当完成流程的时候所有下一步要执行的任务(包括各种分支)都会创建一个Activity记录到数据库中。例如领导审核节点点击“同意”按钮就会流转到人事审批节点,如果“驳回”那就流转到调整请假内容节点,每一次操作的Task背后实际记录更详细的活动(Activity)。
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162664.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • GridLayout用法「建议收藏」

    GridLayout用法「建议收藏」概述  在Android中,使用的最多的布局是LinearLayout了,它可以让布局界面中的子控件以常见的方式比如水平或者垂直方向对齐。在使用LinearLayout时,开发者应该会记得,会经常遇到复杂的布局结构,所以会时常使用各种LinearLayout进行嵌套,而且应该注意嵌套层次不要过多。  有很多不错的文章(比如有:AndroidLayoutTricks#1,Flattening

  • 冯诺依曼与哈佛结构的区别[通俗易懂]

    冯诺依曼与哈佛结构的区别[通俗易懂]cortexM3,M4主要采用哈弗结构       个人理解:最主要的区别在于程序空间和数据空间是否是一体的,冯·诺依曼结构数据空间和地址空间是不分开的,而哈佛结构数据空间和地址空间是分开的      哈弗结构的优势:如果采用流水线设计,如三级流水线:取指,译指,…

  • Python入门篇-基础语法

    Python入门篇-基础语法Python入门篇-基础语法作者:尹正杰版权声明:原创作品,谢绝转载!否则将追究法律责任。一.编程基础1>.程序一组能让计算机识别和执行的指令。2>.电子计算机能够执行程序的

  • navicat15 永久激活码-激活码分享2022.02.27「建议收藏」

    (navicat15 永久激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • 光流法学习「建议收藏」

    光流法学习「建议收藏」光流的计算光流估计就是指利用时间上相邻的两帧图像,得到点的运动。满足以下几点假设:前后两帧点的位移不大(泰勒展开)外界光强保持恒定。空间相关性,每个点的运动和他们的邻居相似(连续函数,泰勒展开

  • notifyone和notifyall区别_notify被动形式

    notifyone和notifyall区别_notify被动形式Notify与notifyall的区别notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号