转载请注明源地址:http://www.cnblogs.com/lighten/p/5927949.html

1.前言

之前学习的时候一直在其它文章看到activiti提供了七个接口来操作工作流,但在5.21版本中,查看源码发现目前是提供了八个服务。这里说个查看源码的小技巧,查看源码要弄明白创作者的思路,也就要看其写的功能模块和类的继承体系了,在eclipse中点击类名,按F4就能查看这个类的相关信息和继承了这个类的子类,一般都是点在抽象类和接口上,这样可以很快看到有些什么内容。举个例子,activiti是由配置文件开始的,这样就可以点击ProcessEngineConfiguration,按F4查看,往上看其实现的接口,一层层向上,最终会看到如下图的结构:

这里最上层的就是接口EngineServices,里面一个是配置,一个是流程引擎。配置就是用来设置相关参数的,并用于初始化流程引擎,流程引擎用于提供相关服务。八项服务可以从配置类中看到,更直接的就是从ProcessEngineImpl中看里面的方法。下图为配置中定义的地方:

下面给出这八项服务在源码中的注解及其翻译(翻译的不好,直接看原注解):

(1)RepositoryService:Service providing access to the repository of process definitions and deployments.服务提供与流程定义和部署存储的关联。

(2)RuntimeService:无英文注解,用于一条流程运行的相关操作。

(3)HistoryService:Service exposing information about ongoing and past process instances.  This is different from the runtime information in the sense that this runtime information only contains the actual runtime state at any given moment and it is optimized for runtime process execution performance.  The history information is optimized for easy querying and remains permanent in the persistent storage.服务公开了正在进行的以及过去的流程实例相关信息。不同于运行时的信息,运行时信息只包含任意给出的时刻实际运行的状态,这有益于运行时流程执行性能。历史信息有利于查询并且是永久保存的。

(4)IdentityService:Service to manage {@link User}s and {@link Group}s.服务用于管理用户和用户组。

(5)TaskService:Service which provides access to {@link Task} and form related operations.服务提供任务和表单关联的相关操作。

(6)FormService:Access to form data and rendered forms for starting new process instances and completing tasks.提供表单数据和呈现表单为启动一个新的流程实例和完成任务。

(7)ManagementService:Service for admin and maintenance operations on the process engine.服务管理和维护流程引擎的操作。

(8)DynamicBpmnService:Service providing access to the repository of process definitions and deployments.这个注解和RepositoryService的相同,但里面的方法肯定是不同的。我查了一下,这个服务是在5.19版本开始提供的,从名称和里面的方法名来看是用于动态改变信息的。

2.服务内容详解

以RepositoryService详细介绍,其它的类似,大致归类一下(具体方法用eclipse的快捷提示键,一般知道每个服务大致提供什么功能,直接看名字差不多就知道是不是自己需要的)。这里对所有服务的方法名通用的规则做个简单的介绍:createXXX这种名称的方法一般是为了构建查询器,但也有创建对象的,如createDeployment(),这个是个例外。newXXX一般就是创建实际内容了,比如newModel(),newUser(),配合saveXXX来保存对象内容。getXXX就是为了获得一些内容了,deleteXXX就是删除一些内容了。至于addXXX和setXXX这两个很难划分差别,add可能偏向于添加额外的东西,如关系,监听器等,set偏向于设置属性。removeXXX是移除,和删除还是有很大的区别。当然还会有其它的方法名,是服务特有的内容,无法用这种规律性的名称。

2.1 RepositoryService

RepositoryService管理流程定义和部署及相关资源的操作。

1.创建一个模型(模型是用于设计流程图的原型)

Model newModel();

2.保存一个模型

void saveModel(Model);

3.创建部署者

DeploymentBuilder createDeployment();

4.部署

Deployment deploy(DeploymentBuilder);

5.添加:add

为定义的流程授权用户(这个用在什么地方有什么效果暂时未知):

addCandidateStarterGroup(processDefinitionId, userId)

addCandidateStarterUser(processDefinitionId, userId)

添加模型编辑的资源:

addModelEditorSource(modelId, byte[])

addModelEditorSourceExtra(modelId, byte[])

6.查询:create

创建查询,查询部署信息,查询流程定义,查询模型信息:

createModelQuery()    createNativeModelQuery()

createDeploymentQuery()    createNativeDeploymentQuery()

createProcessDefinitionQuery()    createNativeProcessDefinitionQuery()

7.获取资源:get

获取模型,部署和流程定义等资源:

ReadOnlyProcessDefinition getDeployedProcessDefinition(processDefinitionId)

List<String> getDeploymentResourceNames(deploymentId)

List<IdentityLink> getIdentityLinksForProcessDefinition(processDefinitionId)

Model getModel(modelId)

…(这里就不具体说明了,使用的时候直接使用提示键)

8.删除资源:delete

删除模型,部署和流程定义的授权群体:

deleteModel(modelId)

deleteDeployment(deploymentId, boolean cascade) cascade决定是否删除流程实例

deleteCandidateStarterUser(processDefinitionId, userId)

deleteCandidateStarterGroup(processDefinitionId, groupId)

9.激活和挂起定义的流程:activate | suspend

定义流程,激活流程和挂起流程都有两种方式:通过流程定义id(这个一般是程序自动生成的)或者是流程定义key(这个是自定义的关键字,用于识别具体是哪个流程。注意:虽然程序中并没有限制其一定不同,但是一般只用于同一个流程,版本更新才会使用同一个key,不然按照程序逻辑,使用相同key值得流程,按key值查找,只会找最近一个设置为这个值的流程定义)。

activateProcessDefinitionById    activateProcessDefinitionByKey

suspendProcessDefinitionById    suspendProcessDefinitionByKey

这些方法中可以设置具体激活或者挂起的日期,但是这要开启job executor,这个是旧版本的,在较新的版本中应该是async executor(前一个官方文档中说是历史遗留问题,一般推荐使用新的机制,但是前一个还是可以使用)。

10.其它

changeDeploymentTenantId(deploymentId, newTenantId)

boolean isProcessDefinitionSuspended(processDefinitionId)

setDeploymentCategory(deploymentId, category)

setProcessDefinitionCategory(processDefinitionId, category)

List<ValidationError> validateProcess(BpmnModel)

2.2 其他

RuntimeService:主要与流程实例有关,流程定义是指设计的一个流程,流程实例是指真正的一个事件,比如请假流程是设计的一个流程,小明请假则是一个具体的流程实例。这项服务可以创建一个流程实例,即启动一个流程,中断或者激活一个流程实例,以及设置信号事件触发器,消息时间触发器(这些和启动流程的条件有关),设置变量,事件监听等一系列和流程实例有关的操作。

HistoryService:主要是用于查询流程的运行记录,只有查询和删除的操作,没有增加和修改。主要查询活动实例,细节,流程实例,变量实例以及任务实例,对应数据库中相应的表。

IdentityService:主要用于控制用户和用户组,要注意流程引擎本身是没有用户限制的,在用户任务的时候可以指定用户完成,这个不是必须的。这个服务包括用户以及用户组的:创建,保存和删除,以及它们之间的关系,用户详细信息的创建等操作。

TaskService:主要用于流程中的任务节点的相关操作,BPMN实际上有很多种类型的任务,不单单是用户任务,这个的设置主要是针对用户任务的相关设置,其它类型的任务并不需要太多的设置,大部分都是自动类型的任务,需要相应的触发条件。

FormService:主要用于表单数据的保存和获取,有启动流程的表单和任务过程中产生的表单。

ManagementService:这个服务功能比较杂,看里面的方法大致有这些功能:查询数据库表的相关信息,Job相关的查询,删除。还有事件日志的相关操作。总的来说是activiti的一些全局相关的操作。

DynamicBpmnService:这个服务是5.19版本后新增的一个服务,和RepositoryService的作用相似,都是与流程定义有关,但是却完全不同。从名字上来看是动态的BPMN服务,看里面的方法都是改变流程的相关属性。这个方法就可以直接操作流程定义,而不需要读取模型,再设计部署(一个流程基本要经过创建模型,设计画图,生产BPMN的XML文件,再部署成流程定义,这个服务就可以直接操作流程定义,不会改变原本的文件,个人感觉可能会带来一些的问题,但是目前对于流程流转内部实现还没有完全理解,使用要谨慎,比如有的流程正在运行老版本的定义,这个时候改变流程定义,接下来怎么流转之类的都是问题)。

3 最后

对于工作流,实际上看其接口就能大致使用了,但这样还是不够的。如果再加上其核心本质的BPMN的相关知识,大致对应用场景有所认识,就能更好的理解这个工具了。下一章预计就是介绍BPMN的相关知识了。这些都了解了之后就会实际介绍具体如何操作了,测试工作流的各个组件的用法。但是这样仅仅是会使用而已,一些细节的坑不看源代码不会发现有值得注意的地方,比如上面说的流程定义的KEY,基本是不能相同的,但是代码中没有控制,也不会控制,因为是允许的,有这样的场景会需要KEY相同。如果这些流程,操作不当就会产生不可预知的问题了。所以深入了解源码还是有必要的。

activiti搭建(四)八项服务介绍的更多相关文章

  1. activiti搭建(五)BPMN介绍

    转载请注明源地址:http://www.cnblogs.com/lighten/p/5931207.html 对于BPMN我也不是十分清楚,目前也只是因为对于Modeler中不熟悉的组件查询,来对这部 ...

  2. 第四章 NFS服务相关介绍

    一.NFS服务介绍 1.什么是NFS?是一个共享存储,文件服务器 2.NFS基本概述NFS是Network File System的缩写及网络文件系统.NFS主要功能是通过局域网络让不同的主机系统之间 ...

  3. Windows Server 2012R2 DHCP服务介绍及搭建 转载

    转载链接:https://blog.csdn.net/KamRoseLee/article/details/79251830   一.什么是DHCP DHCP(DynamicHost Configur ...

  4. Java四类八项基本数据类型

    一. 四类八项基本数据类型 1. 整数类型(byte.short.int.long) 三点注意事项: a. Java各整数类型有固定的表示范围和字段长度,其不收操作系统的影响,以保持Java的可移植性 ...

  5. Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端 目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Se ...

  6. Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】

    Spring Cloud(四):服务容错保护 Hystrix[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  分布式系统中经常会出现某个基础服务不可用 ...

  7. 微服务介绍及Asp.net Core实战项目系列之微服务介绍

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.微服务选型 在做微服务架构的技术选型的时候,我们以“无侵入”和“社区活跃”为主要的考量点,将来升级为原子服务架构.量子服务架构 ...

  8. Linux nfs服务介绍

    nfs服务介绍 nfs(Network File System) 网络文件系统,能使用户访问服务器的文件系统,就像访问自己的本机的文件系统一样,并且多个 客户端共享访问该文件系统. 目前nfs服务,较 ...

  9. 超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数

    超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数 介绍galera cluster原理的文章已经有一大堆了,百度几篇看一看就能有相关了解,这里就不赘述了.本文主 ...

随机推荐

  1. 四步轻松实现用Visio画UML类图

    本节和大家一起学习一下用Visio画UML类图的方法,主要有四个步骤,这里和大家分享一下,相信通过本节的学习,你对Visio画UML类图的步骤一定会有所了解. 用Visio画UML类图 对于画类图的工 ...

  2. map遍历测试结果

    结论:一般情况下推荐使用enterSet的for循环(即以下的方法2),如果只是取key值可以使用keySet性能会更好. 因为keySet只取key,enterSet即取了key又取了value. ...

  3. 九度OJ1008

    这道题其实就是一个简单的Dijkstra变形,只是要考虑重边的情况. 当在更新图中点到起点的距离时,将花费p也计算在内:如果长度与之前计算的值相等,则再考虑此时花费p是否会更少,是的话则仍然要更新最短 ...

  4. Go Mobile 例子 audio 源码分析

    看这个源码分析前,建议先看更简单地例子 basic 的源码分析(http://www.cnblogs.com/ghj1976/p/5183199.html), 一些基础知识本篇将不再提及. audio ...

  5. 算法库:基础线性代数子程序库(Basic Linear Algebra Subprograms,BLAS)介绍

    调试DeepFlow光流算法,由于作者给出的算法是基于Linux系统的,所以要在Windows上运行,不得不做大量的修改工作.移植到Windows平台,除了一些头文件找不到外,还有一些函数也找不到.这 ...

  6. 查看mysql表结构的几种方法

    desc 表名; show columns from 表名; describe 表名; show create table 表名; use information_schemaselect * fro ...

  7. asp.net子窗体与父窗体交互

    今天在项目上遇到了这个问题,其实只是window.returnValue的简单应用,不是asp.net的专属内容.作为积累,记录一个简单的实现模型. 图1  用到的文件 从图1中我们可以看到,只用到了 ...

  8. POJ 3308 Paratroopers(最小割EK(邻接表&矩阵))

    Description It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the ...

  9. 关于前置式递增和后置式递增的小知识(++x与x++)

    list<char>::iterator pos; //list<char> coll; for(pos=coll.begin();pos!=coll.end();++pos) ...

  10. linux创建用户和用户组

    Linux创建用户.用户组 及 删除 在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组.创建用户user1的时候指定其所属工作组users,例 ...