咖啡兔老师的视频:http://www.osforce.cn/course/308/learn#lesson/1919
Activiti提供了多种创建流程引擎的方式,ProcessEngineConfiguration.buildProcessEngine(),或者ProcessEngines.init()方法来创建ProcessEngine实例。
一个ProcessEngine实例代表一个流程引擎。
所有创建ProcessEngine实例均被注册到ProcessEngines中,这里所说的注册,实际上是ProcessEngines类中维护一个Map对象,该对象的key为ProcessEngine实例的名称,value为ProcessEngine的实例。
一、Service
7个api,每个api,每个方法都有一个命令command,把所有的操作放在命令里,所有的命令操作都在一个事物里。简单清晰,易于维护、扩展。命令需要提供上下文的东西,通过拦截器来做。
当调用引擎Service接口时,实际上调用的是不同的Command,但是接口并不是直接调用的命令,而是把命令交给CommandExecutor统一执行,因为通过它可以在命令执行过程中执行若干拦截器。通过CommandContextInterceptor拦截器可以为所有的Command准备好命令上下文CommandContext对象,以便在Command实现类中获取到引擎配置对象、会话对象等。
每个command都可以配置拦截器:前置拦截器、后置拦截器、默认拦截器。其中默认拦截器有LogInterceptor、RetryInterceptor。RetryInterceptor乐观锁重试,缓解乐观锁问题,会做超时等待、重试。
CommandContext通过ThreadLocal实现,和线程绑定,是线程安全的。
二、BPMN
流程驱动、业务流程根据BPMN文件进行解析,去事件处理和流程转换。
Process类时Activiti中用来描述BPMN2.0元素的JavaBean,Process表示一个流程。
流程部署之后,会把流程对象缓存到内存中,简单的一个key-value的map对象缓存
xml可以和bean互转,可以xml做持久化,bean,流程对象缓存到引擎中。
BPMN:Business Process Modeling and Notation业务流程建模与标注,是workflow的建模语言标准之一。定义了业务流程图的一套标准语言,比如活动(任务和子流程)是矩形,条件是菱形。
资源以二进制流的方式保存,通过api获取流对象,转换为需要的资源三、PVM
底层由PVM来驱动实现
PVM把业务流程的特性抽取出来,怎么去驱动。
PVM抽象了业务驱动模型
JVM抽象了虚拟机的特性
PVM把业务流程的特性抽取出来,驱动流程的流转。
四、事件处理器
在工作流引擎中,有很多事件,通过事件处理器处理:
流程内事件:会做监听类的。在task上配置,在complete上配置,做触发。内部有一个注入。
全局事件:引擎层面的。比如实体创建、流程引擎启动,流程挂起、激活。在引擎配置文件中配置注入事件处理器。
引擎内部先去触发事件,然后找对应的处理器。处理器会有一个注入。提供对应的处理数据。