流程引擎的API和服务基础

简介:

RepositoryService :  管理和控制 发布包 和 流程定义(包含了一个流程每个环节的结构和行为) 的操作

除此之外,服务可以

  • 查询引擎中的发布包和流程定义。

  • 暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。

  • 获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。

  • 获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。

RuntimeService : 负责启动一个流程定义的新实例,获取和保存 流程变量,查询流程实例和执行

TaskService :所有与任务有关的功能

  • 查询分配给用户或组的任务

  • 创建 独立运行 任务。这些任务与流程实例无关。

  • 手工设置任务的执行者,或者这些用户通过何种方式与任务关联。

  • 认领并完成一个任务。认领意味着一个人期望成为任务的执行者, 即这个用户会完成这个任务。完成意味着“做这个任务要求的事情”。 通常来说会有很多种处理形式。

IdentityService:  管理(创建,更新,删除,查询...)群组和用户

FormService:  一个可选服务,这个服务提供了 启动表单 和 任务表单 两个概念

 HistoryService:  提供了Activiti引擎的所有历史数据

ManagementService : 在使用Activiti的定制环境中基本上不会用到。 它可以查询数据库的表和表的元数据。另外,它提供了查询和管理异步操作的功能。

RepositoryService

获取方式:

//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();

任何与“静态”资源有关的数据(比如流程定义)都可以通过 RepositoryService

访问。 从概念上讲,所以静态数据都是Activiti的资源内容。

部署流程文件:

/** * 发布流程 * 发布流程后,流程文件会保存到数据库中 */@Testpublicvoid deployFlow(){RepositoryService repositoryService = processEngine.getRepositoryService();//获取在classpath下的流程文件InputStream in = this.getClass().getClassLoader().getResourceAsStream("myleave.zip");ZipInputStream zipInputStream = new ZipInputStream(in);//使用deploy方法发布流程repositoryService.createDeployment()//通过ZIP方式来部署流程文件 .addZipInputStream(zipInputStream)//通过输入流来部署流程文件//.addInputStream("xx.bpmn",inputStream)//.addInputStream("xx.png", inputStream) .name("Myleave")//设置流程定义的别名 .deploy();//部署}

当文件部署成功后,会操作数据库中的这三张表

act_re_deployment  (部署信息表) 

存放流程定义的别名和部署时间

act_re_procdef(流程定义数据表)

存放流程定义的信息,每部署一个新的流程定义都会在这张表中增加一条记录。

如果当KEY相同 也就是 bpmn流程文件的 ID 相同是  增加的记录里面的版本会升级一个版本

act_ge_bytearray (资源文件表)

存放部署后的流程文件

查看流程定义信息:

/** * 查看流程定义 * 查询act_re_procdef表 流程定义表 */@Testpublicvoid queryProcdef(){RepositoryService repositoryService = processEngine.getRepositoryService();//创建查询对象ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();//添加查询条件query.processDefinitionKey("myProcess");//通过key获取// .processDefinitionName("My process")//通过name获取// .orderByProcessDefinitionId()//根据ID排序//.processDefinitionKeyLike(processDefinitionKeyLike)//支持模糊查询//.listPage(firstResult, maxResults)//分页//执行查询获取流程定义明细List
       
       
       
       
       
        
        
        
        
         pds = query.list();
        
        
        
        
        //获取批量的明细
        
        
        
        
        //.singleResult()//获取单个的明细
        
        
        
        
        for (ProcessDefinition pd : pds) {System.out.println(
        
        
        
        
        "ID:"+pd.getId()+
        
        
        
        
        ",NAME:"+pd.getName()+
        
        
        
        
        ",KEY:"+pd.getKey()+
        
        
        
        
        ",VERSION:"+pd.getVersion()+
        
        
        
        
        ",RESOURCE_NAME:"+pd.getResourceName()+
        
        
        
        
        ",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());System.out.println(
        
        
        
        
        "------------------------------------------------");}}
       
       
       
       
       

运行结果:

ID:myProcess:1:604,NAME:Myprocess,KEY:myProcess,DEPLOYMENT_ID:601,VERSION:1,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png------------------------------------------------ID:myProcess:2:809,NAME:Myprocess,KEY:myProcess,DEPLOYMENT_ID:806,VERSION:2,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png------------------------------------------------

显示图片:

通过 repositoryService查看流程定义信息,并且获取DEPLOYMENT_ID到  act_ge_bytearray 查询到 资源文件名

通过资源文件名和deploymentId获取流并输出到文件中

/** * 显示图片信息 * @throws IOException */@Testpublicvoid showImg() throws IOException{String deploymentId = "601";//通过deploymentId获取资源名称List
       
       
       
       
       
        
        
        
        
         names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);String imgName = 
        
        
        
        
        null;
        
        
        
        
        for (String name : names) {System.out.println(
        
        
        
        
        "name:"+name);
        
        
        
        
        if (name.endsWith(
        
        
        
        
        ".png")) {imgName = name;}}System.out.println(
        
        
        
        
        "imgName:"+imgName);
        
        
        
        
        if (imgName != 
        
        
        
        
        null) {File file = 
        
        
        
        
        new File(
        
        
        
        
        "e:/"+imgName);
        
        
        
        
        //获取资源文件的流InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, imgName);
        
        
        
        
        //通过FileUtils将资源文件以流的信息输出到指定文件FileUtils.copyInputStreamToFile(in, file);}}
       
       
       
       
       

在E盘下查看 生成的照片

删除流程定义:

/** * 删除流程定义 */@Testpublicvoid delDeployment(){String deploymentId = "1";processEngine.getRepositoryService()//普通删除,删除没有在执行的流程,如果流程正在执行,则抛出异常//.deleteDeployment(deploymentId);//级联删除,不管你在不在运行,会删除当前关联的所有信息,包括在历史表里的数据.deleteDeployment(deploymentId, true);}

RuntimeService

获取方式:

//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();

启动一个流程实例:

/** * 启动流程实例 */@Testpublicvoid startFlow(){RuntimeService runtimeService = processEngine.getRuntimeService();//通过Id来启动一个流程并返回一个流程实例ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());}

当一个流程实例启动后,会在  act_ru_execution 

表中插入一条记录,如果是用户任务节点,同时也会在

act_ru_task

表中插入一条记录

查询流程状态:

/** * 查看流程状态 */@Testpublicvoid queryState(){String processInstanceId = "701";ProcessInstance pi = processEngine.getRuntimeService()//创建执行对象查询,查询正在执行的执行对象//.createExecutionQuery().createProcessInstanceQuery()//创建流程实例查询,查询正在执行的流程实例.processInstanceId(processInstanceId)//通过流程实例ID查询//返回批量结果//.list().singleResult();//返回唯一的结果if (pi != null) {System.out.println("当前流程:"+pi.getActivityId());}else {System.out.println("流程已经结束");}}

在整个流程执行的过程中,流程ID 都是 唯一不变的,当流程结束后 流程记录就会在 

act_ru_execution

表中被删除,存入到历史表

设置和获取流程变量:

/** * 通过runtimeService设置流程变量 * 设置流程变量 */publicvoid setAndGetVariables(){RuntimeService runtimeService = processEngine.getRuntimeService();//通过执行对象ID和key value设置变量//value是一个object对象,当一个pojo类实现Serializable接口的时候就可以存入流程变量中//runtimeService.setVariable(executionId, key, value);//设置专属于一个执行对象ID的流程变量//runtimeService.setVariableLocal(executionId, key, value);//通过执行对象ID和Map设置多个变量Map
       
       
       
       
       <string, object="">
        
        
        
        
         paramMap = 
        
        
        
        
        new HashMap
        
        
        
        
        <string, object="">
          (); 
         //runtimeService.setVariables(executionId, paramMap); 
         //设置专属于一个执行对象ID的多个流程变量 
         //runtimeService.setVariablesLocal(executionId, paramMap); 
         //通过执行对象ID获取变量,返回object,需要强转 
         //runtimeService.getVariable(executionId, key); 
         //通过执行对象ID获取一个Map 
          <string, object="">
            对象 
           
         //runtimeService.getVariables(executionId);} 
        
       
       
       
       
       

流程变量所支持的类型

设置的流程变量会存入到 act_ru_variable 表

act_ru_variable 表  的BYTEARRAY_ID_对应的是 act_ge_bytearray 如果是复杂类型的数据  会存入二进制字段中

TaskService

获取方式:

//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取任务服务对象TaskService taskService = processEngine.getTaskService();

查看个人任务:

/** * 查看任务 */@Testpublicvoid queryTask(){//获取任务服务对象TaskService taskService = processEngine.getTaskService();//根据接受人查询该用户的任务List
       
       
       
       
       
        
        
        
        
         tasks = taskService.createTaskQuery()
        
        
        
        
        //模糊查询
        
        
        
        
        //.taskAssigneeLike(assigneeLike)
        
        
        
        
        //通过执行对象ID查询任务
        
        
        
        
        //.executionId(executionId).taskAssignee(
        
        
        
        
        "张三")
        
        
        
        
        //通过接受人来查询个人任务.list();
        
        
        
        
        for (Task task : tasks) {System.out.println(
        
        
        
        
        "ID:"+task.getId()+
        
        
        
        
        ",姓名:"+task.getName()+
        
        
        
        
        ",接收人:"+task.getAssignee()+
        
        
        
        
        ",开始时间:"+task.getCreateTime());}}
       
       
       
       
       

运行结果

ID:704,姓名:员工请假,接收人:张三,开始时间:WedOct 22 17:03:04CST 2014ID:804,姓名:员工请假,接收人:张三,开始时间:ThuOct 23 11:27:47CST 2014

除了个人任务 还有 组任务

办理任务:

/** * 办理任务 */@Testpublicvoid startTask(){TaskService taskService = processEngine.getTaskService();//taskId 就是查询任务中的 IDString taskId = "704";//完成请假申请任务taskService.complete(taskId );}

taskService 和 runtimeService 一样都是可以设置流程变量的

HistoryService

获取方式:

//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();

查询历史任务:

/** * 查询历史任务 */@Testpublicvoid queryHistoryTask(){String assignee = "张三";HistoryService historyService = processEngine.getHistoryService();List
       
       
       
       
       
        
        
        
        
         htis = historyService.createHistoricTaskInstanceQuery()
        
        
        
        
        //创建历史任务查询对象
        
        
        
        
        //创建一个历史详细信息查询对象
        
        
        
        
        //.createHistoricDetailQuery()
        
        
        
        
        //创建历史流程实例查询对象
        
        
        
        
        //.createHistoricProcessInstanceQuery().taskAssignee(assignee)
        
        
        
        
        //根据接受人查询历史任务.list();
        
        
        
        
        //返回批量结果
        
        
        
        
        for (HistoricTaskInstance hti : htis) {System.out.println(
        
        
        
        
        "ID:"+hti.getId()+
        
        
        
        
        ",流程实例ID:"+hti.getProcessInstanceId()+
        
        
        
        
        ",接收人:"+hti.getAssignee()+
        
        
        
        
        ",执行对象ID:"+hti.getExecutionId());System.out.println(
        
        
        
        
        "------------------------------------------------");}}
       
       
       
       
       

结果:

ID:704,流程实例ID:701,接收人:张三,执行对象ID:701------------------------------------------------ID:804,流程实例ID:801,接收人:张三,执行对象ID:801------------------------------------------------

主要是查询

act_hi_taskinst

表中的数据

/** * 查询历史流程实例 */@Testpublicvoid queryHistoryPi(){HistoryService historyService = processEngine.getHistoryService();String pi = "701";List
       
       
       
       
       
        
        
        
        
         hpis = historyService.createHistoricProcessInstanceQuery()
        
        
        
        
        //创建历史流程实例查询对象.processInstanceId(pi).list();
        
        
        
        
        for (HistoricProcessInstance hpi : hpis) {SimpleDateFormat sdf = 
        
        
        
        
        new SimpleDateFormat(
        
        
        
        
        "yyyy-MM-dd HH:mm:ss");System.out.println(
        
        
        
        
        "实例ID:"+hpi.getId()+
        
        
        
        
        ",开始时间:"+sdf.format(hpi.getStartTime())+
        
        
        
        
        ",结束时间:"+sdf.format(hpi.getEndTime()));System.out.println(
        
        
        
        
        "-------------------------------------");}}
       
       
       
       
       

结果:

实例ID:701,开始时间:2014-10-22 17:03:04,结束时间:2014-10-23 15:25:03-------------------------------------

主要是查询 act_hi_procinst 表中的数据

获取历史流程变量:

/** * 获取历史流程变量 */@Testpublicvoid getHistoryVariable(){HistoryService historyService = processEngine.getHistoryService();List
       
       
       
       
       
        
        
        
        
         hvis = historyService.createHistoricVariableInstanceQuery()
        
        
        
        
        //创建一个历史流程变量实例查询对象.variableName(
        
        
        
        
        "key")
        
        
        
        
        //通过key查询.list();
        
        
        
        
        if (hvis != 
        
        
        
        
        null) {
        
        
        
        
        for (HistoricVariableInstance hvi : hvis) {System.out.println(
        
        
        
        
        "key:"+hvi.getVariableName()+
        
        
        
        
        ",value:"+hvi.getValue());}}}
       
       
       
       
       

主要是查询

act_hi_varinst

表中的数据

查询历史活动信息:

/** * 查询历史活动信息 * 主要查询的是act_hi_actinst表中的数据 */@Testpublicvoid queryHistoryAi(){String pi = "701";HistoryService historyService = processEngine.getHistoryService();List
       
       
       
       
       
        
        
        
        
         hais = historyService.createHistoricActivityInstanceQuery()
        
        
        
        
        //创建历史活动实例查询对象.processInstanceId(pi).list();
        
        
        
        
        for (HistoricActivityInstance hai : hais) {System.out.println(
        
        
        
        
        "活动ID:"+hai.getActivityId()+
        
        
        
        
        ",活动名称:"+hai.getActivityName()+
        
        
        
        
        ",活动类型:"+hai.getActivityType()+
        
        
        
        
        ",流程实例ID:"+hai.getProcessInstanceId()+
        
        
        
        
        ",接收人:"+hai.getAssignee());System.out.println(
        
        
        
        
        "--------------------------------");}}
       
       
       
       
       

结果:

活动ID:endevent1,活动名称:End,活动类型:endEvent,流程实例ID:701,接收人:null--------------------------------活动ID:startevent1,活动名称:Start,活动类型:startEvent,流程实例ID:701,接收人:null--------------------------------活动ID:员工请假,活动名称:员工请假,活动类型:userTask,流程实例ID:701,接收人:张三--------------------------------活动ID:老板审批,活动名称:老板审批,活动类型:userTask,流程实例ID:701,接收人:老板--------------------------------

这几个是最常用的几个服务.


本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/5213176.html,如需转载请自行联系原作者

相关文章
|
7天前
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
|
7天前
|
存储 缓存 安全
API在Visual Basic中的应用:连接外部服务与扩展功能
【4月更文挑战第27天】本文探讨了在Visual Basic中使用API连接外部服务和扩展功能的方法,涵盖了API的基本概念、种类及如何使用本地和Web API。通过DllImport调用本地API,利用HttpClient和WebClient与Web API交互,同时强调了第三方API的使用和SOA架构中的API角色。安全性、性能优化和错误处理是实践中的关键点。案例研究和最佳实践有助于开发者更有效地利用API,提升Visual Basic应用程序的功能和灵活性。随着API技术的发展,Visual Basic将持续支持开发者创造更强大的应用。
|
2天前
|
负载均衡 Java API
构建高效微服务架构:API网关与服务熔断策略
【5月更文挑战第2天】 在微服务架构中,确保系统的高可用性与灵活性是至关重要的。本文将深入探讨如何通过实施有效的API网关和设计合理的服务熔断机制来提升分布式系统的鲁棒性。我们将分析API网关的核心职责,包括请求路由、负载均衡、认证授权以及限流控制,并讨论如何利用熔断器模式防止故障传播,维护系统的整体稳定性。文章还将介绍一些实用的技术和工具,如Netflix Zuul、Spring Cloud Gateway以及Hystrix,以帮助开发者构建一个可靠且高效的微服务环境。
|
6天前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使用阿里云API或SDK从函数计算调用ECS实例的服务如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
30 4
|
6天前
|
机器学习/深度学习 人工智能 API
人工智能平台PAI产品使用合集之机器学习PAI-EAS部署好后,服务的公网API和URL怎么配置
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
16天前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
在Python中实现Web服务(RESTful API)涉及选择框架(如Flask、Django、FastAPI),定义路由及处理函数(对应HTTP请求方法),处理请求,构建响应和启动服务器。以下是一个使用Flask的简单示例:定义用户列表,通过`@app.route`装饰器设置GET和POST请求处理函数,返回JSON响应,并用`app.run()`启动服务器。实际API会包含更复杂的逻辑和错误处理。
15 1
|
24天前
|
JavaScript 前端开发 API
如何利用Python的Flask框架与Vue.js创建RESTful API服务
【4月更文挑战第10天】本文介绍了如何使用Flask和Vue.js创建一个前后端分离的RESTful API服务。Flask作为后端框架,负责提供CRUD操作,与SQLite数据库交互;Vue.js作为前端框架,构建用户界面并利用axios库与后端API通信。通过示例代码,展示了Flask设置路由处理用户数据以及Vue组件如何调用API获取和操作数据。此基础结构为构建更复杂的Web应用提供了起点。
|
1月前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
2月前
|
Java API
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(三)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
24 0
|
2月前
|
存储 设计模式 监控
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(二)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
28 0