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

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

时间: 2025-01-12 04:29:53

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

activiti搭建(五)BPMN介绍

对于BPMN我也不是十分清楚,目前也只是因为对于Modeler中不熟悉的组件查询,来对这部分的内容进行学习,不求一次理解,边学边理解吧.所以这一章的介绍会比较简单,但也足够了. Modeler中的组件列表划分和BPMN的略微有些不同,而且有些内容好像也没有,最后移植到自己的demo中,还遇到了一些问题,如果可能的话,之后会详细介绍一下Modeler的构成,大致是官方文档的第七节Overview以及第十节Process(重要),网上已有人将其归纳总结过了 http://wenku.baidu.co

Android笔记1——开发前奏1开发环境搭建和开发工具使用介绍

转载请注明http://www.cnblogs.com/devtrees/p/4382234.html 欢迎指正错误,共同进步! 一背景知识 1.1G-4G的介绍 Generation(一代) WAP(wait and pay) Wireless Markup Language(WML)精简版的html语言 二.Android概述 1.Android操作系统介绍 2.Android历史介绍 3.Android系统架构(重点) 第一层:应用层Application 第二层:应用框架层Applica

从无到有搭建中小型互联网公司后台服务架构与运维架构视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

“灾难无情人有情”:备战金三银四之微服务架构问题!(含解析)

前言: 现在IT界跳槽已成常态,跳槽,可能有以下原因: 技术达到瓶颈,无法在此公司有好的提升,前几年我感觉基本不会出现,至少我现在没出现. 实力与薪资不匹配. 和同事 领导不和,如果你在几家公司都这样,要自我检讨一下是不是自己的问题. 仅个人观点,其他诸如地域 情感 兴趣等个人原因不做讨论. 这也导致很多企业在用人时会比较在意员工的稳定性一般外包公司都会比较忙,相对来说,成长应该是比较快的,而你的工作性质偏业务,那么你要想清楚一个问题,以后你的发展轨迹是怎样的?是在技术方向越走越远呢,还是在管理

SharePoint 2013 Word 转换PDF服务介绍及示例

原文:SharePoint 2013 Word 转换PDF服务介绍及示例 前言:在SharePoint使用过程中,经常会发现将文档进行格式转换的需求,之前,看到SharePoint 2013有将PPT转换PDF文档的服务,后来,才发现SharePoint 2010开始,就有将Word文档转换PDF的服务了,用起来还是不错的. 下面,我们就来看看这个服务,如何将一个Word文档库批量转换成PDF文件,或者,将单一Word文档转换为PDF文档. 一.             效果展示 新建测试Wor

LINUX服务介绍(清晰版)

http://www.linuxdiyf.com/viewarticle.php?id=172539 服务列表(按字母顺序排列) 服务名 必需(是/否) 用途描述 注解 acon 否 语言支持 特别支持左手书写语言:阿拉伯语,波斯语和希伯莱语 acpi 否 电源管理 手提电脑电池电扇监控器 acpid 否 监听精灵进程 此进程监听并分配内核中的acpi事件 adsl 否 内部ADSL开关控制 只有你的计算机内部有互联网连接adsl开关时才用到此服务 alsa 否 高级Linux声音构件 这个单独

基于Web Service的客户端框架搭建四:终结篇

前言 这是这个系列的终结篇,前面3个博客介绍了一下内容: 1.使用Http Post方式调用Web Service 2.客户端框架之数据转换层 3.客户端框架之代理层 框架结构 框架是基于C#的,在VS2010中搭建出来的,解决方案搭建完毕之后的框架结构如下图: 如上图,框架主要分数据层Data,数据转换成FCL,代理层Proxy,功能分发层Dispatcher以及界面层UI. 1.数据转换层FCL 数据格式转换层,位于在Proxy服务代理层和UI界面层之间.在UI层使用的都是明确的实例对象(比

博客园客户端UAP开发随笔 -- App UI设计的三大纪律八项注意

前言 每一个页面都是这个App的门面,尤其是主页面,看上去干净整洁清爽宜人容易操作,那么你的App就成功了一半.这也反映出了你这个开发团队的基本审美素质和设计理念.如果你不是一个团队,而是一个个人开发者,建议你好好读读以下心得体会,相信会帮助你做出好看而实用的App.用一堆拥有丑陋UI的App充斥Window Store,不是我们高大上的程序员所为,被其他手机开发平台的开发者们耻笑. 三大纪律: 1)不乱用颜色.一个页面内不要超过3种颜色 2)不乱用大图片当背景.你是想让用户看你的背景图片呢,还

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

Spring Cloud(四):服务容错保护 Hystrix[Finchley 版] 发表于 2018-04-15 |  更新于 2018-05-07 | 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应.为了应对服务雪崩,一种常见的做法是手动服务降级.而 Hystrix 的出现,给我们提供了另一种选择. Hystrix [h?st'r?ks] 的中文含义是 "豪猪",豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与 Hy