zoukankan      html  css  js  c++  java
  • 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 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    深入理解volatile
    定时任务分布式锁的简单实现
    spring boot在tomcat运行多环境配置分离方案
    java spring boot data jpa和javaagent兼容问题
    RabbitMQ PHP操作类,守护进程及相关测试数据
    Python httpsqs封装类
    Python守护进程(多线程开发)
    python游戏打包exe
    处理谷歌地图marker旋转
    在vue-cli项目中mockjs和vConsole的使用
  • 原文地址:https://www.cnblogs.com/xin1006/p/3374499.html
Copyright © 2011-2022 走看看