activiti搭建(四)八项服务介绍

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

1.前言

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

image

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

image

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

    (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相同。如果这些流程,操作不当就会产生不可预知的问题了。所以深入了解源码还是有必要的。

原文地址:https://www.cnblogs.com/lighten/p/5927949.html