《Activiti实战》摘抄&笔记3

##Query API简介 Activiti的查询API:
1)标准查询 :在以Java对象的方式通过创建一个指定类型的Query对象(实现Query接口)后用链式编程的方式设置查询参数。弊端:不能支持复杂的查询,比如多张表联合查询或者使用OR关系查询;
2)Native查询 :允许采用标准SQL的方式查询流程对象,不过Native查询仅支持部分流程对象(查询结果只能返回引擎的固定几个对象,返回结果不能自定义),并且查询对象需要实现NativeQuery接口。sql(String sql)可以接受一个标准的SQL语句。其中表名可以通过ManagementService#getTaskName()获取,条件以MyBatis的格式设置,以'#'标注一个参数的开始,然后用'{...}'设置参数名称,最后用链式编程方式调用paramter()方法设置每一个参数的值。
3) CustomSqlExecution : 基于Mybatis的查询接口,允许开发人员使用Mybatis的语法查询数据,并且查询结果的类型很灵活,该功能被封装在ManagementService接口的executeCustomSql方法中: <MapperType, ResultType> ResultType executeCustomSql(CustomSqlExecution<MapperType, ResultType> customSqlExecution);
MapperType:表示定义Mybatis语法查询的接口类型;
ResultTYpe:表示返回结果的类型;
Query API

##管理员特性 流程状态
假设这样一个场景:一个正在运行的流程实例由于某些原因要暂停,从技术上来说就是"挂起",当条件满足之后再恢复状态继续运行该流程实例。

在Activiti中,这一过程有2个对应的操作:挂起(suspend)、激活(active)。除了控制流程实例外还可以控制流程定义(ProcessDefinition)的状态,并且可以选择是否激活与流程定义相关的流程实例,以及定是激活或挂起。

流程定义权限控制
从Activiti5.10版本开始引擎把用户任务的候选配置移植到流程级别上,从而可以根据登录系统的用户所拥有的角色决定是否有权查询、启动流程。

读取引擎属性
引擎提供了一个便捷的接口可以快速获取引擎配置信息:managementService.getProperties();

读取引擎属性
引擎提供了查询引擎数据库的接口,用户获取与引擎数据库表的结构、记录。此功能封装在ManagementService接口中。TableMetaData,TablePage...

##统一身份管理
在一个完整的系统中,身份模块式必不可少的,用于管理系统的用户、组织、角色或岗位。大多数系统都会有组织的管理,而在Activiti中并没有组织的概念,也没有角色的管理,取而代之的是组。

###引擎身份接口方式
####1. 通过引擎接口同步数据 通过引擎接口同步数据是一种“非侵入式”的同步方法,做法类似于引擎中的监听,当现有身份模块的用户数据变更时调用Activiti引擎的IdentityService接口的对应方法同步操作。当然在同步数据时要做好数据的校验工作,例如在添加、修改用户和组时要先检查对象是否存在防止引擎接口抛出异常。

这种同步身份数据方式的特点在于“不破坏”引擎表结构、面向接口编程。如果根据用户ID查询相关的候选任务,那么SQL的过滤条件:在ACT_RU_IDENTITYLINK表中类型类candidate且USER_ID_字段等于当前用户ID,或任务有候选组且当前人与候选组有关联关系(在ACT_ID_MEMBERSHIP表中维护)。

当我们操作业务系统的用户、角色以及两者关系时把这些更改都同步到引擎的表中,所以引擎内部的SQL关联查询可以正常工作。之所以在这里强调用户与组的关系是因为下面介绍的第2种方式就不能使用与ACT_ID_MEMBERSHIP表关联查询了,因为下面的方式会禁用引擎的身份模块表。

####2. 自定义Session工厂
Activiti的每一张表都有一个对应的实体管理器,在引擎初始化时会初始化所有表的实体管理类(提供CRUD等功能),每一个实体类都有一个对应的实体管理类(XxxEntityManager)及 实体管理工厂类(XxxEntityManagerFactory)。实体管理工厂类实现SessionFactory接口。 (是个坑,可能自己没有理解透,TaskService底层也有用到identity相关的表做关联,单单只改IdentityService用到的实体类管理工具不够。后来就直接继承ProcessEngineConfiguration相关实现类重写getMyBatisXmlConfigurationSteam方法修改mybatis配置文件里的identity相关的mapping文件)

####3. 用视图代替物理表
在引擎中,和身份相关的表如下:
ACT_ID_USER: 用户表;
ACT_ID_INFO:用户信息表;
ACT_ID_GROUP:组,也可以理解为角色;
ACT_ID_MEMBERSHIP:用户与组的关系,这也是查询任务候选人需要关联的表。

相比前2种方式,使用视图代理物理表显得“轻量”一些,把引擎的物理表删除,取而代之是与物理表同名的视图,只要保证视图的结构与原来物理表的表结构及字段类型一致即可。

采用这种方式需要在配置引擎的时候把属性dbIdentityUsed设置为false,即禁用身份模块的功能,实际上是在初始化引擎时不再检查ACT_ID_*表是否存在。

##REST服务 发布REST API
集成REST API
集成流程图跟踪组件Diagram Viewer
基于REST服务搭建流程中心:基础架构,表单模型选型,统一的组件,事务管理
集成流程设计器Activiti Moderler

##入侵Activiti ###解析BPMN文件 部署流程:

  1. 引擎会解析XML格式的流程文件提取流程定义(ProcessDefinition)对象,部署动作由BpmnDeployer类负责,下图展示该类依赖的各种解析器、处理器的结构图:
  2. 把BpmnDeployer处理得到的流程对象,保存到引擎数据库并缓存;
    3)同时也会保存相关的资源文件到数据库。

###命令与拦截器
外观模式(Facade)、命令模式(Command)、拦截器模式(Interceptor)是常见的设计模式,也是Activiti整体架构采用的三种主要设计模式,所有的API均以这三种模式为基础实现。

“面向接口编程”是Activiti API设计的一大设计思想,对外公开的所有API均用抽象定义的方式,提供了7大模块的XxxService接口,这也是采用了外观模式的表现;引擎的内部实现不对外公开,开发人员只要调用暴露的API编程接口实现相应的功能。基于抽象的接口还可以覆盖引擎内部的实现,使用自定义的实现类替换(在引擎配置对象中可以配置)。

在Activiti中所有操作均对应一个命令接口(Command)实现类,这样不同的功能分散到N个命令中,易于维护与扩展;当调用引擎XxxService接口时实际上是调用不同的Commande,但接口并不是直接调用命令,而是把命令交给CommandExecutor统一执行,因为通过它可以在命令执行中执行若干拦截器(类似JAVAEE中的Filter链)。

Activit中的拦截器可以为所有的Command命令准备好命令上下文(CommandContext)对象,以便在Command实现类中获取到引擎配置对象(获取引起配置属性)、会话对象(Session),以及其他扩展属性等;还可以为Command提供食物管理器、乐观锁自动重试等功能。

###流程虚拟机PVM
PVM(Process Virtual Machine)流程虚拟机,是Activiti整个流程驱动(流程推进)机制的核心规范。

Activiti源码分析

转载于:https://my.oschina.net/braveCS/blog/706682

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值