##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:表示返回结果的类型;
sql
##管理员特性 流程状态
假设这样一个场景:一个正在运行的流程实例因为某些缘由要暂停,从技术上来讲就是"挂起",当条件知足以后再恢复状态继续运行该流程实例。数据库
在Activiti中,这一过程有2个对应的操做:挂起(suspend)、激活(active)。除了控制流程实例外还能够控制流程定义(ProcessDefinition)的状态,而且能够选择是否激活与流程定义相关的流程实例,以及定是激活或挂起。编程
流程定义权限控制
从Activiti5.10版本开始引擎把用户任务的候选配置移植到流程级别上,从而能够根据登陆系统的用户所拥有的角色决定是否有权查询、启动流程。设计模式
读取引擎属性
引擎提供了一个便捷的接口能够快速获取引擎配置信息:managementService.getProperties();
缓存
读取引擎属性
引擎提供了查询引擎数据库的接口,用户获取与引擎数据库表的结构、记录。此功能封装在ManagementService接口中。TableMetaData,TablePage...mybatis
##统一身份管理
在一个完整的系统中,身份模块式必不可少的,用于管理系统的用户、组织、角色或岗位。大多数系统都会有组织的管理,而在Activiti中并无组织的概念,也没有角色的管理,取而代之的是组。架构
###引擎身份接口方式
####1. 经过引擎接口同步数据 经过引擎接口同步数据是一种“非侵入式”的同步方法,作法相似于引擎中的监听,当现有身份模块的用户数据变动时调用Activiti引擎的IdentityService接口的对应方法同步操做。固然在同步数据时要作好数据的校验工做,例如在添加、修改用户和组时要先检查对象是否存在防止引擎接口抛出异常。app
这种同步身份数据方式的特色在于“不破坏”引擎表结构、面向接口编程。若是根据用户ID查询相关的候选任务,那么SQL的过滤条件:在ACT_RU_IDENTITYLINK表中类型类candidate且USER_ID_字段等于当前用户ID,或任务有候选组且当前人与候选组有关联关系(在ACT_ID_MEMBERSHIP表中维护)。ide
当咱们操做业务系统的用户、角色以及二者关系时把这些更改都同步到引擎的表中,因此引擎内部的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文件 部署流程:
###命令与拦截器
外观模式(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整个流程驱动(流程推动)机制的核心规范。