流程引擎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 instanceLog.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

Activiti-02-activiti api的更多相关文章

  1. Activiti学习——Activiti与Spring集成

    转: Activiti学习——Activiti与Spring集成 与Spring集成 基础准备 目录结构 相关jar包 Activiti的相关jar包 Activiti依赖的相关jar包 Spring ...

  2. Activiti(1) - TaskRuntime API 入门

    目录 TaskRuntime API pom.xml 注册TaskRuntime实例 角色与分组 任务事件监听器 DemoApplication 源码 Activiti 是一个自动化工作流框架.它能帮 ...

  3. activiti 6 查询api

    1 activiti 查询多字段排序 每个字段都要有 sortBy -> desc/asc [sortBy -> desc/asc] [sortBy -> desc/asc] 2 使 ...

  4. Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

    可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal  error  war ...

  5. (二)Activiti之——activiti数据库表介绍

    1. 数据库表的命名 Activiti的表都以ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的API对应. ACT_RE_*: 'RE'表示repository. 这个前缀的表包 ...

  6. idea 2019 集成activiti, idea activiti 新建bpmn文件, 解决idea activiti中文乱码

    idea 在线安装activiti插件 1. File-->Settings 2. 点击Plugins, 右侧界面点击Marketplace后在搜索框搜索 actiBPM 注: 网络原因没有加载 ...

  7. 引入Activiti配置文件activiti.cfg.xml

    前面我们用代码实现了生成25张activiti表,今天我们用Activiti提供的activiti.cfg.xml配置文件来简化实现前面的功能: 官方文档参考地址:http://activiti.or ...

  8. 【Activiti学习之四】Activiti API(三)

    环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.启动流程 多种方式启动 package com.wjy.pro; import or ...

  9. 【Activiti学习之三】Activiti API(二)

    环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.流程定义1.中止与激活流程定义 package com.wjy.pd; import ...

  10. 工作流引擎Activiti 专题

    https://github.com/Activiti/Activiti Quick Start Guide This quick start assumes: Familiarity with Ma ...

随机推荐

  1. 编译安装 Python3.6.1

    操作系统 centos7.2 系统自带python版本 2.7.5 说明:编译python3的过程是简单的但比较慢,可以用连字符 && ,这样可以先去(忙其他的|喝茶|听音乐|聊妹), ...

  2. 零碎的JS基础

    一.js的三种弹窗: 警告框            弹出警告alert() 确认框            有确认内容的框confirm()有两个值,true和false 当用户按下确认键后,打印tru ...

  3. composer安装报错Composer throws [ReflectionException] Class Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist

    解决方法:删除C:\Users\Administrator\AppData\Roaming\Composer\vendor\fxp下的文件

  4. angular中封装fancyBox(图片预览)

    首先在官网下载最新版的fancyBox(一定要去最新网站,以前依赖的jquery版本偏低),附上链接:http://fancyapps.com/fancybox/3/ 然后在项目中引用jquery,然 ...

  5. SoapUI进行接口测试,怎么应对接口地址总是变化!

    如果是没有代码能力的小白,要利用工具进行接口测试的时候,经常会遇到接口地址或者接口参数变化的问题,然后不得不在他们改了接口之后,就手动去改所有的请求链接地址和接口参数!1-5个请求,我们手动改还应付的 ...

  6. [2016-07-15]nuget包管理器控制台下的powershell脚本介绍

    博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...

  7. Markdown最佳实践

    Markdown 最佳实践 结合目前看到的信息,总结使用Markdown的最方便的方式. 我的需求是: 能够配合各种笔记软件使用,目前主要使用的是为知笔记和有道笔记.笔记的内容需要记录代码及数学公式, ...

  8. 【详细资料】ICN6211:MIPI DSI转RGB芯片简介

    ICN6211功能MIPI DSI转RGB,分辨率1920*1200,封装QFN48

  9. 前端开发【第一篇:HTML】

    HTML初识 1.什么是HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都 ...

  10. java中的抛出异常throws与throw

    throws与throw throws是方法可能抛出异常的声明.(用在声明方法时,表示该方法可能要抛出异常)语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{.. ...