核心API
1:ProcessEngine
说明:
1) 在Activiti中最核心的类,其他的类都是由他而来。
2) 产生方式:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 流程引擎

3) 可以产生RepositoryService
processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service

4) 可以产生RuntimeService
processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service

5) 可以产生TaskService
processEngine.getTaskService()// 与正在执行的任务管理相关的Service

各个Service的作用:
RepositoryService 管理流程定义
RuntimeService 执行管理,包括启动、推进、删除流程实例等操作
TaskService 任务管理
HistoryService 历史管理(执行完的数据的管理)
IdentityService 组织机构管理
FormService 一个可选服务,任务表单管理
ManagerService

2:RepositoryService
是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片。
1) 产生方式
 processEngine.getRepositoryService()
2) 可以产生DeploymentBuilder,用来定义流程部署的相关参数

processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
.createDeployment()// 创建一个部署对象

3) 删除流程定义
processEngine.getRepositoryService().deleteDeployment(deploymentId)

3:RuntimeService
是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。
4:TaskService
是activiti的任务服务类。可以从这个类中获取任务的信息。
5:HistoryService
是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。
6:ProcessDefinition
流程定义类。可以从这里获得资源文件等。
7:ProcessInstance
代表流程定义的执行实例。如范冰冰请了一天的假,她就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。
8:Execution
Activiti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,Execution就是同ProcessInstance。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。
如图为ProcessInstance的源代码:

从源代码中可以看出ProcessInstance就是Execution。但在现实意义上有所区别:

在单线流程中,如上图的贷款流程,ProcessInstance与Execution是一致的。

这个例子有一个特点:wire money(汇钱)和archive(存档)是并发执行的。 这个时候,总线路代表ProcessInstance,而分线路中每个活动代表Execution。
总结:
* 一个流程中,执行对象可以存在多个,但是流程实例只能有一个。
* 当流程按照规则只执行一次的时候,那么流程实例就是执行对象。

package cn.miye.test;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; public class HelloWorld { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 流程引擎 /** 部署流程定义 */
@Test
public void deploymentProcessDefinition() {
// deployment对象存在对应act_re_deployment表中的一条数据
// 部署流程定义会在act_re_deployment表中插入一条数据,
// 也会在act_re_procdef中增加一条数据
Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
.createDeployment()// 创建一个部署对象
.name("helloworld入门程序")// 添加部署的名称
.addClasspathResource("diagrams/helloworld.bpmn")// 从classpath的资源中加载,一次只能加载一个文件
.addClasspathResource("diagrams/helloworld.png")// 从classpath的资源中加载,一次只能加载一个文件
.deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());//
System.out.println("部署名称:" + deployment.getName());// helloworld入门程序
} /** 启动流程实例 */
@Test
public void startProcessInstance() {
// 启动流程实例会在act_ru_execution中增加一条数据,表示流程开始执行
// 在act_ru_identitylink中增加一条数据,表示流程当前的执行人
// 在act_ru_task中增一条数据
// 在act_hi_taskinst中增一条数据
// 在act_hi_procinst中增一条数据
// 在act_hi_actinst中增一条数据
// 流程定义的key
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey);
// 使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值
// 为什么使用使用key值启动,因为使用key启动,默认是按照最新版本的流程定义启动
// 启动返回一个流程实例对象
System.out.println("流程实例ID:" + pi.getId());// 流程实例ID 101
System.out.println("流程定义ID:" + pi.getProcessDefinitionId());// 流程定义ID helloworld:1:4
} /** 查询当前人的个人任务 */
@Test
public void findMyPersonalTask() {
String assignee = "王五";
// 在在act_ru_task中查询数据
List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.createTaskQuery()// 创建任务查询对象
.taskAssignee(assignee)// 指定个人任务查询,指定办理人
.list();
if (list != null && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务的创建时间:" + task.getCreateTime());
System.out.println("任务的办理人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("执行对象ID:" + task.getExecutionId());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
} /** 完成我的任务 */
@Test
public void completeMyPersonalTask() {
// 任务ID
String taskId = "302";
processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.complete(taskId);
System.out.println("完成任务:任务ID:" + taskId);
} }

04--activiti demo的更多相关文章

  1. React 实践记录 04 Flux demo

    Introduction flux应用架构如下图所示,本文并不是讲述怎么立即做一个酷炫的应用,而是讲述如何依照这种框架,来进行代码的组织. 我们先把这个流程转述为文字:抛开与webAPI的交互不谈,以 ...

  2. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  3. Activiti - 新一代的开源BPM引擎

    Activiti 背景简介.服务和功能介绍 背景介绍 Activiti 其核心是 BPMN 2.0 的流程引擎.BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准,全称为 Business P ...

  4. Activiti - 新一代的开源 BPM 引擎 (zhuan)

    http://www.ibm.com/developerworks/cn/Java/j-lo-activiti1/ ****************************************** ...

  5. Activiti工作流引擎核心介绍

    引言 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速.超稳定的 BPMN 2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更 ...

  6. Activiti - 新一代的开源 BPM 引擎

    http://www.ibm.com/developerworks/cn/Java/j-lo-activiti1/ ****************************************** ...

  7. Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期

    BPMN 2.0介绍 业务流程模型注解(BusinessProcess Modeling Notation - BPMN)是业务流程模型的一种标准图形注解.这个标准是由对象管理组(Object Man ...

  8. 『安全工具』注入神器SQLMAP

    Pic by Baidu 0x 00 前言 正是SQLMAP这种神器的存在,SQL注入简直Easy到根本停不下来.... PS:国内类似软件也有阿D,明小子,挖掘机,当你用过他们之后你才会发现SQLM ...

  9. REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解

    转载自处blog.csdn.net/tantexian. SOA: 维基百科解释:SOA:面向服务的软件架构(Service Oriented Architecture),是一种计算机软件的设计模式, ...

  10. OD: Memory Attach Technology - Exception

    看到第六章了:形形色色的内存攻击技术 异常处理结构体 S.E.H Structure Exception Handler S.E.H 是 Windows 处理异常的重要数据结构.每个 S.E.H 为 ...

随机推荐

  1. 害死人不偿命的(3n+1)猜想 (15)

    #include <iostream> #include <algorithm> using namespace std; int main(){ int n; while ( ...

  2. Ilya And The Tree CodeForces - 842C

    ((半个)智商题,主要难度在于实现) 题意:有一棵n个结点组成的树,其根是编号为1的结点.对于每一个结点,生成从根结点走到这个结点的路径(包括自身),选择路径上的一个点或者不选择任何点,使得其它点的最 ...

  3. 容器API

  4. Jquery show()方法图解

    前两天面试的时候被问到了show()方法,当时回答的实在是太惨烈... 晚上看了一下,最简单的走法是直接移除行内样式的style属性. 如果这步走完了,元素还是隐藏的(display为none),元素 ...

  5. 微服务dubbo面试题

    dubbo的工作原理? dubbo支持的序列化协议? dubbo的负载均衡和高可用策略?动态代理策略? dubbo的SPI思想? 如何基于dubbo进行服务治理.服务降级.失败重试以及超时重试? du ...

  6. Linux--NiaoGe-Service-01

    安装环境介绍 CentOS 6.9_x86_64 我们选择的是基本安装,也即“Basic Server”. 安装完成后重启来到(runlevel 3)纯文本界面. 例题 批量创建账号:假设有5个账号x ...

  7. 动手实现 Redux(三):纯函数(Pure Function)简介

    我们接下来会继续优化我们的 createStore 的模式,让它使我们的应用程序获得更好的性能. 但在开始之前,我们先用一节的课程来介绍一下一个函数式编程里面非常重要的概念 —— 纯函数(Pure F ...

  8. List<DTO>转 Map<String,List<DTO>> 两种写法

    List<TeamScheduleDTO> list = JSON.parseArray(response.getData().getJSONArray("list") ...

  9. 通过流传入excel解析的问题

    做了个excel文件导入的功能,接收excel文件流,先读取文件流头部信息确定文件类型,然后调用poi方法 OPCPackage pkg = OPCPackage.open(inputStream) ...

  10. mySQL 从删库到跑路

    问题: 使用python实现load data infile ...向mySQL中导入数据.虽然成功执行但是数据库中没增加记录. 解决: zz的我execute之后没有commit.