activiti6基础01-如何数据库操作及相关表
官网文档:https://www.activiti.org/userguide/#queryAPI
1. Activit的简单源码解读
activiti的官方文档讲解详细很详细,也很范。按着文档写完了一个简单的demo发现,现实中的大多数问题,还是没法很好的解决。
例如:首先我需要知道的是,activiti的有那些表,及各个表的作用。这个网上有人罗列过,但总是觉得不通透。
所以,我先简单看了一下activiti数据处理的源码。
1.1 流程发布
- RepositoryServiceImpl
进行对那个操作的封装,传递Command接口的对应子类,里面封装了具体的操作
public Deployment deploy(DeploymentBuilderImpl deploymentBuilder) {
return commandExecutor.execute(new DeployCmd<Deployment>(deploymentBuilder));
}
- CommandInvoker
commandExecutor.execute() 这个方法的执行本质,是里面的CommandInterceptor执行链式的execute,而实质执行的是传进来的CMD接口类的execute方法。具体如下所示。
public <T> T execute(final CommandConfig config, final Command<T> command) {
final CommandContext commandContext = Context.getCommandContext();
//省略一些代码
commandContext.getAgenda().planOperation(new Runnable() {
@Override
public void run() {
commandContext.setResult(command.execute(commandContext));//这里是关键
}
});
// 省略一些代码。。。。。。。。。。。。
return (T) commandContext.getResult();
}
- DeploymentEntityManagerImpl
实际数据库操作的是DataManager的实现类,进行数据库操作。
这个我们能看出来是有两个
@Override
public void insert(DeploymentEntity deployment) {
insert(deployment, false);
for (ResourceEntity resource : deployment.getResources().values()) {
resource.setDeploymentId(deployment.getId());
getResourceEntityManager().insert(resource);
}
}
- 对应的xml操作
在mapping目录下可以查找到对应的操作。前面的${prefix}标识数据库,activiti已经帮我们判断好了,不需要我们再传入。
<insert id="insertDeployment" parameterType="org.activiti.engine.impl.persistence.entity.DeploymentEntityImpl">
insert into ${prefix}ACT_RE_DEPLOYMENT(ID_, NAME_, CATEGORY_, KEY_, TENANT_ID_, DEPLOY_TIME_, ENGINE_VERSION_)
values(#{id, jdbcType=VARCHAR}, #{name, jdbcType=VARCHAR}, #{category, jdbcType=VARCHAR}, #{key, jdbcType=VARCHAR}, #{tenantId, jdbcType=VARCHAR}, #{deploymentTime, jdbcType=TIMESTAMP}, #{engineVersion, jdbcType=VARCHAR})
</insert>
<insert id="insertResource" parameterType="org.activiti.engine.impl.persistence.entity.ResourceEntityImpl">
insert into ${prefix}ACT_GE_BYTEARRAY(ID_, REV_, NAME_, BYTES_, DEPLOYMENT_ID_, GENERATED_)
values (#{id, jdbcType=VARCHAR}, 1, #{name, jdbcType=VARCHAR}, #{bytes, jdbcType=${blobType}}, #{deploymentId, jdbcType=VARCHAR}, #{generated, jdbcType=BOOLEAN})
</insert>
1.2 数据查询
- DataManager
数据查询操作本质都是通过DataManger的实现类MybatisDeploymentDataManager进行操作;
@Override
public List<Deployment> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
return commandContext.getDeploymentEntityManager().findDeploymentsByQueryCriteria(this, page);
}
@Override
@SuppressWarnings("unchecked")
public List<Deployment> findDeploymentsByQueryCriteria(DeploymentQueryImpl deploymentQuery, Page page) {
final String query = "selectDeploymentsByQueryCriteria";
return getDbSqlSession().selectList(query, deploymentQuery, page);
}
- 查找xml中对应的sql
<select id="selectDeploymentsByQueryCriteria" parameterType="org.activiti.engine.impl.DeploymentQueryImpl" resultMap="deploymentResultMap">
${limitBefore}
select distinct RES.* ${limitBetween}
<include refid="selectDeploymentsByQueryCriteriaSql"/>
${orderBy}
${limitAfter}
</select>
1.3 任务执行
需要了解任务类型,以及网关相关知识。
- TaskService
taskService.complete(task.getId(), taskVariables);
- AbstractCompleteTaskCmd
protected void executeTaskComplete(CommandContext commandContext, TaskEntity taskEntity, Map<String, Object> variables, boolean localScope) {
// Task complete logic
if (taskEntity.getDelegationState() != null && taskEntity.getDelegationState().equals(DelegationState.PENDING)) {
throw new ActivitiException("A delegated task cannot be completed, but should be resolved instead.");
}
//执行节点监听事件
commandContext.getProcessEngineConfiguration().getListenerNotificationHelper().executeTaskListeners(taskEntity, TaskListener.EVENTNAME_COMPLETE);
if (Authentication.getAuthenticatedUserId() != null && taskEntity.getProcessInstanceId() != null) {
//查找任务select * from ${prefix}ACT_RU_EXECUTION
// where ROOT_PROC_INST_ID_ = (select ROOT_PROC_INST_ID_ from ${prefix}ACT_RU_EXECUTION where ID_ = #{parameter})
ExecutionEntity processInstanceEntity = commandContext.getExecutionEntityManager().findById(taskEntity.getProcessInstanceId());
//任务和identity绑定
commandContext.getIdentityLinkEntityManager().involveUser(processInstanceEntity, Authentication.getAuthenticatedUserId(),IdentityLinkType.PARTICIPANT);
}
ActivitiEventDispatcher eventDispatcher = Context.getProcessEngineConfiguration().getEventDispatcher();
if (eventDispatcher.isEnabled()) {
if (variables != null) {
eventDispatcher.dispatchEvent(ActivitiEventBuilder.createEntityWithVariablesEvent(ActivitiEventType.TASK_COMPLETED, taskEntity, variables, localScope));
} else {
eventDispatcher.dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.TASK_COMPLETED, taskEntity));
}
}
//删除已有的任务相关数据
commandContext.getTaskEntityManager().deleteTask(taskEntity, null, false, false);
// Continue process (if not a standalone task) 激活下个步骤工作
if (taskEntity.getExecutionId() != null) {
ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findById(taskEntity.getExecutionId());
Context.getAgenda().planTriggerExecutionOperation(executionEntity);
}
}
1.4 获取类对应表名称
ManagementService
managementService.getTableName()
TableDataManagerImpl
static {
// runtime
entityToTableNameMap.put(TaskEntity.class, "ACT_RU_TASK");
entityToTableNameMap.put(ExecutionEntity.class, "ACT_RU_EXECUTION");
entityToTableNameMap.put(IdentityLinkEntity.class, "ACT_RU_IDENTITYLINK");
entityToTableNameMap.put(VariableInstanceEntity.class, "ACT_RU_VARIABLE");
entityToTableNameMap.put(JobEntity.class, "ACT_RU_JOB");
entityToTableNameMap.put(TimerJobEntity.class, "ACT_RU_TIMER_JOB");
entityToTableNameMap.put(SuspendedJobEntity.class, "ACT_RU_SUSPENDED_JOB");
entityToTableNameMap.put(DeadLetterJobEntity.class, "ACT_RU_DEADLETTER_JOB");
entityToTableNameMap.put(EventSubscriptionEntity.class, "ACT_RU_EVENT_SUBSCR");
entityToTableNameMap.put(CompensateEventSubscriptionEntity.class, "ACT_RU_EVENT_SUBSCR");
entityToTableNameMap.put(MessageEventSubscriptionEntity.class, "ACT_RU_EVENT_SUBSCR");
entityToTableNameMap.put(SignalEventSubscriptionEntity.class, "ACT_RU_EVENT_SUBSCR");
// repository
entityToTableNameMap.put(DeploymentEntity.class, "ACT_RE_DEPLOYMENT");
entityToTableNameMap.put(ProcessDefinitionEntity.class, "ACT_RE_PROCDEF");
entityToTableNameMap.put(ModelEntity.class, "ACT_RE_MODEL");
entityToTableNameMap.put(ProcessDefinitionInfoEntity.class, "ACT_PROCDEF_INFO");
// history
entityToTableNameMap.put(CommentEntity.class, "ACT_HI_COMMENT");
entityToTableNameMap.put(HistoricActivityInstanceEntity.class, "ACT_HI_ACTINST");
entityToTableNameMap.put(AttachmentEntity.class, "ACT_HI_ATTACHMENT");
entityToTableNameMap.put(HistoricProcessInstanceEntity.class, "ACT_HI_PROCINST");
entityToTableNameMap.put(HistoricVariableInstanceEntity.class, "ACT_HI_VARINST");
entityToTableNameMap.put(HistoricTaskInstanceEntity.class, "ACT_HI_TASKINST");
entityToTableNameMap.put(HistoricIdentityLinkEntity.class, "ACT_HI_IDENTITYLINK");
// a couple of stuff goes to the same table
entityToTableNameMap.put(HistoricDetailAssignmentEntity.class, "ACT_HI_DETAIL");
entityToTableNameMap.put(HistoricDetailTransitionInstanceEntity.class, "ACT_HI_DETAIL");
entityToTableNameMap.put(HistoricFormPropertyEntity.class, "ACT_HI_DETAIL");
entityToTableNameMap.put(HistoricDetailVariableInstanceUpdateEntity.class, "ACT_HI_DETAIL");
entityToTableNameMap.put(HistoricDetailEntity.class, "ACT_HI_DETAIL");
// Identity module
entityToTableNameMap.put(GroupEntity.class, "ACT_ID_GROUP");
entityToTableNameMap.put(MembershipEntity.class, "ACT_ID_MEMBERSHIP");
entityToTableNameMap.put(UserEntity.class, "ACT_ID_USER");
entityToTableNameMap.put(IdentityInfoEntity.class, "ACT_ID_INFO");
// general
entityToTableNameMap.put(PropertyEntity.class, "ACT_GE_PROPERTY");
entityToTableNameMap.put(ByteArrayEntity.class, "ACT_GE_BYTEARRAY");
entityToTableNameMap.put(ResourceEntity.class, "ACT_GE_BYTEARRAY");
entityToTableNameMap.put(EventLogEntryEntity.class, "ACT_EVT_LOG");
// and now the map for the API types (does not cover all cases)
apiTypeToTableNameMap.put(Task.class, "ACT_RU_TASK");
apiTypeToTableNameMap.put(Execution.class, "ACT_RU_EXECUTION");
apiTypeToTableNameMap.put(ProcessInstance.class, "ACT_RU_EXECUTION");
apiTypeToTableNameMap.put(ProcessDefinition.class, "ACT_RE_PROCDEF");
apiTypeToTableNameMap.put(Deployment.class, "ACT_RE_DEPLOYMENT");
apiTypeToTableNameMap.put(Job.class, "ACT_RU_JOB");
apiTypeToTableNameMap.put(Model.class, "ACT_RE_MODEL");
// history
apiTypeToTableNameMap.put(HistoricProcessInstance.class, "ACT_HI_PROCINST");
apiTypeToTableNameMap.put(HistoricActivityInstance.class, "ACT_HI_ACTINST");
apiTypeToTableNameMap.put(HistoricDetail.class, "ACT_HI_DETAIL");
apiTypeToTableNameMap.put(HistoricVariableUpdate.class, "ACT_HI_DETAIL");
apiTypeToTableNameMap.put(HistoricFormProperty.class, "ACT_HI_DETAIL");
apiTypeToTableNameMap.put(HistoricTaskInstance.class, "ACT_HI_TASKINST");
apiTypeToTableNameMap.put(HistoricVariableInstance.class, "ACT_HI_VARINST");
// identity
apiTypeToTableNameMap.put(Group.class, "ACT_ID_GROUP");
apiTypeToTableNameMap.put(User.class, "ACT_ID_USER");
// TODO: Identity skipped for the moment as no SQL injection is provided
// here
}
2.activiti表格及对应的数据
初次使用中使用到的表格(后续继续补充)
类型 | 表格名称 | 存储的数据 | 备注 |
---|---|---|---|
生成 | ACT_GE_BYTEARRAY | 存储部署的bpmn相关文件 | |
re | ACT_RE_DEPLOYMENT | 发布的流程数据 | |
re | act_re_procdef | 存储流程分解数据 | |
runtime | ACT_RU_TASK | 正在运行的任务 | |
runtime | ACT_RU_VARIABLE | 用于存储流程流转中的字段 | PROC_INST_ID_ 对应ACT_RU_TASK中的EXECUTION_ID_ TASK_ID_ 对应 ACT_RU_TASK中的ID_ |
runtime | ACT_RU_EXECUTION | 运行时流程执行实例 | |
history | act_hi_taskinst | 流程历史步骤数据 | |
history | act_hi_variable | 历史步骤流程中转字段 | |
history | act_hi_procinst | 已经发起的流程实例 | 已经结束的流程任务END_ACT_ID_不为空 |
activiti6基础01-如何数据库操作及相关表的更多相关文章
- 【ABAP系列】SAP ABAP基础-数据更新至数据库操作解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP基础-数据更新至 ...
- django基础 -- 5. ORM 数据库操作
一. ORM 对象关系映射 类 ------ 表 类对象 ------ 记录 类属性 ------ 字段 二. 连接数据库配置 1.在 setting.py 文件中重新设置 ...
- PHP基础:MYSQL数据库操作
1.连接到数据库: · 面向对象的方法: $db = new mysqli('hostname', 'username', 'password', 'dbname'); · 面向过程的方法: $db ...
- SQL Server 基础 01 数据库、表操作
对着书慢慢学习,一天一点点! 数据库操作 (create.alter.drop) --3-3-1 /create database 语句创建数据库 create database testSQL - ...
- ThinkPHP 学习笔记 ( 三 ) 数据库操作之数据表模型和基础模型 ( Model )
//TP 恶补ing... 一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: publ ...
- JSP中的数据库操作,MySQL基础操作(一)
一.JDBC JDBC(java data base concectivity),是一种用于执行SQL语句的java API,可以为多种关系库提供统一访问. 通常使用JDBC完成以下操作: 1)同数据 ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )
一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function te ...
- laravel基础课程---13、数据库基本操作2(lavarel数据库操作和tp对比)
laravel基础课程---13.数据库基本操作2(lavarel数据库操作和tp对比) 一.总结 一句话总结: 非常非常接近:也是分为两大类,原生SQL 和 数据库链式操作 学习方法:使用时 多看手 ...
随机推荐
- java实现第六届蓝桥杯星系炸弹
星系炸弹 题目描述 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天 ...
- Spring MVC详细讲解
一:三层架构和MVC 1:三层架构 我们的开发架构一般都是基于两种形式:一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器.在 JavaEE 开发中,几乎全都是基于 ...
- 使用Json框架解析遇到Java关键字时的解决方案
当Json数据中的key为Java关键字时,在定义实体类的时候不能对该字段进行声明,所以需要对字段进行特殊处理 使用Gson解析 在与Java关键字冲突的字段加上@SerializedName注解 @ ...
- k8s学习-资源清单
4.kubernetes使用 4.1.资源清单 api 文档.api 描述 4.1.2.说明 必须存在的属性 主要的对象 额外的参数项 例子 vim my-app.yml apiVersion: v1 ...
- 手把手教你安装Ubuntu系统增强工具
如果你不安装VMware增强工具的话,VMware经常会给你弹出下图的界面,提示你安装增强工具. 那么VMware增强工具到底有啥特别之处咧?其实在VMware虚拟机中安装好VMwareTools之后 ...
- Redis学习笔记(十九) 发布订阅(上)
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,它的发布与订阅功能由PUBLISH.SUBSCRIBE.PSUBSCRIBE等命令组成. ...
- 2019-02-09 python爬取mooc视频项目初级简单版
今天花了一下午时间来做这东西,之前没有自己写过代码,50几行的代码还是查了很多东西啊,果然学起来和自己动起手来完全是两码事. 方案:requests库+正则表达式提取视频下载链接+urlretriev ...
- CentOS7.5搭建spark2.3.1集群
一 下载安装包 1 官方下载 官方下载地址:http://spark.apache.org/downloads.html 2 安装前提 Java8 安装成功 zookeeper 安 ...
- web资源图分析
随着请求数增加,吞吐量没有增大,服务器仍然可以处理,那就是带宽问题 Web资源图是从服务器的角度进行统计分析的,和事务图是两个纬度. 1,每秒点击数 每秒点击数( Hits per Second)统计 ...
- http 的8中请求方式:
http 的8中请求方式: 1.OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 2.HEAD 向服务器索与GET请求相一致 ...