Activiti-02-activiti api

流程引擎API和服务

通过ProcessEngine你可以获取各种服务,它和所有的服务对象都是线程安全的,因此整个整个应用中可以只有一份。

ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();

RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();

ProcessEngines 类会扫描 所有的activiti.cfg.xml activiti-context.xml。对于所有activiti.cfg.xml文件流程引擎将创建典型的Activiti方式: 
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(inputStream).buildProcessEngine().
对于所有的 activiti-context.xml 文件, 流程引擎将以spring方式创建: 首先创建Spring应用程序上下文,然后流程引擎获得应用程序上下文。
.
所有的服务都是无状态的

•RepositoryService: Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 
( 例如 BPMN2.0 XML 文件,表单定义文件,流程定义图像文件等 ),这些文件都存储在 Activiti 内建的 Repository 中。
Repository Service 提供了对 repository 的存取服务。
•RuntimeService:在 Activiti 中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。
  Runtime Service 提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。
•TaskService:在 Activiti 中业务流程定义中的每一个执行节点被称为一个 Task,对流程中的数据存取,状态变更等操作均需要在 Task 中完成。
Task Service 提供了对用户 Task 和 Form 相关的操作。它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。
•IdentityService:Activiti 中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的 Task。
Identity Service 提供了对 Activiti 系统中的用户和组的管理功能。
•ManagementService:Management Service 提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。
•HistoryService: History Service 用于获取正在运行或已经完成的流程实例的信息,与 Runtime Service 中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。
•FormService: Activiti 中的流程和状态 Task 均可以关联业务相关的数据。通过使用 Form Service 可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单
 

Exception机制

在Activiti中,最基础的异常类org.activiti.engine.ActivitiException,子类有ActivitiWrongDbException ActivitiOptimisticLockingException

ActivitiClassLoadingException ActivitiObjectNotFoundException ActivitiIllegalArgumentException ActivitiTaskAlreadyClaimedException

部署过程

假如有下面这样的流程定义文件




<?
xml version="1.0" encoding="UTF-8"?>
<definitionsid="definitions"  targetNamespace="http://activiti.org/bpmn20"  xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:activiti="http://activiti.org/bpmn"><processid="vacationRequest"name="Vacation request">   ....      </process>
</definitions>
部署的Java代码如下:
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();



RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService
.createDeployment().addClasspathResource("org/activiti/test/VacationRequest.bpmn20.xml").deploy();
Log.info("Number of process definitions: "+ repositoryService.createProcessDefinitionQuery().count());  

启动流程实例 

流程定义是“蓝图”,而一个流程实例运行时执行它。在RuntimeService中可以查看每个实例的运行状态,有许多中开始流程实例的方法,下面是使用在xml文件中定义的key获取流程实例
//map中的变量是用来替换流程定义.xml文件中的表达式




Map
<String,Object> variables =newHashMap<String,Object>();
variables
.put("employeeName","Kermit");
variables
.put("numberOfDays",newInteger(4));
variables
.put("vacationMotivation","I'm really tired!");
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);
// Verify that we started a new process instance
Log.info("Number of process instances: "+ runtimeService.createProcessInstanceQuery().count());

完成任务

当流程开始时,第一步便是用户任务.这一步必须由一个系统用户完成. 事实上,一个任务箱中列出了该用户需要处理的所有任务. 



// Fetch all tasks for the management group



TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
for(Task task : tasks){
 
Log.info("Task available: "+ task.getName());
}  
  //任务的完成
Task task = tasks.get(0);


     
Map<String,Object> taskVariables =newHashMap<String,Object>();
taskVariables
.put("vacationApproved","false");
taskVariables
.put("managerMotivation","We have a tight deadline!");
taskService
.complete(task.getId(), taskVariables);
过程继续往下走,

挂起和激活一个过程(Suspending and activating a process)

当一个流程被挂起时,新的流程不能被创建,因为一个异常将被抛出

repositoryService.suspendProcessDefinitionByKey("vacationRequest"); //挂起流程定义
try{
  runtimeService
.startProcessInstanceByKey("vacationRequest");
}catch(ActivitiException e){
  e
.printStackTrace();
}
重新激活一个流程定义 repositoryService.activateProcessDefinitionXXX ()

 挂起一个流程实例也是可能的,例如完成任务时抛出一个异常    

runtimeService.suspendProcessInstance ()

激活流程实例 runtimeService.activateProcessInstanceXXX

  

----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
原文地址:https://www.cnblogs.com/xin1006/p/3374499.html