activiti入门2流程引擎的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的资源内容。

部署流程文件:

/**
	 * 发布流程
	 * 发布流程后,流程文件会保存到数据库中
	 */
	@Test
	public void 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表 流程定义表
	 */
	@Test
	public void 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<ProcessDefinition> 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:My process,KEY:myProcess,DEPLOYMENT_ID:601,VERSION:1,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png
------------------------------------------------
ID:myProcess:2:809,NAME:My process,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
	 */
	@Test
	public void showImg() throws IOException{
		String deploymentId = "601";
		//通过deploymentId获取资源名称
		List<String> 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盘下查看 生成的照片

删除流程定义:

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

RuntimeService

获取方式:

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

启动一个流程实例:

	/**
	 * 启动流程实例
	 */
	@Test
	public void 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表中插入一条记录

查询流程状态:

/**
	 * 查看流程状态
	 */
	@Test
	public void 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设置流程变量
	 * 设置流程变量
	 */
	public void 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();

查看个人任务:

/**
	 * 查看任务
	 */
	@Test
	public void queryTask(){
		//获取任务服务对象
		TaskService taskService = processEngine.getTaskService();
		//根据接受人查询该用户的任务
		List<Task> 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,姓名:员工请假,接收人:张三,开始时间:Wed Oct 22 17:03:04 CST 2014
ID:804,姓名:员工请假,接收人:张三,开始时间:Thu Oct 23 11:27:47 CST 2014

除了个人任务 还有 组任务

办理任务:

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

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

HistoryService

获取方式:

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

查询历史任务:

/**
	 * 查询历史任务
	 */
	@Test
	public void queryHistoryTask(){
		String assignee = "张三";
		HistoryService historyService = processEngine.getHistoryService();

		List<HistoricTaskInstance> htis = historyService.createHistoricTaskInstanceQuery()//创建历史任务查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>
													//创建一个历史详细信息查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>
													//.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表中的数据

查询历史流程实例:

/**
	 * 查询历史流程实例
	 */
	@Test
	public void queryHistoryPi(){
		HistoryService historyService = processEngine.getHistoryService();
		String pi = "701";

		List<HistoricProcessInstance> 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表中的数据

获取历史流程变量:

	/**
	 * 获取历史流程变量
	 */
	@Test
	public void getHistoryVariable(){
		HistoryService historyService = processEngine.getHistoryService();

		List<HistoricVariableInstance> 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表中的数据
	 */
	@Test
	public void queryHistoryAi(){
		String pi = "701";
		HistoryService historyService = processEngine.getHistoryService();

		List<HistoricActivityInstance> 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,接收人:老板
--------------------------------

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

时间: 2024-10-10 22:37:41

activiti入门2流程引擎的API和服务基础的相关文章

activiti学习3:流程引擎对象和流程引擎配置对象

目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配置文件的介绍 四.获取流程引擎配置对象 4.1 读取默认名称的配置文件来创建配置对象 4.2 读取自定义名称的配置文件来创建流程引擎配置对象 五.流程引擎对象 5.1 buildProcessEngine方法创建 5.2 用ProcessEngines类来获取 六.总结 activiti学习3:流程

Activiti入门——环境搭建和核心API简介

相关文章: <史上最权威的Activiti框架学习> <Activiti入门--轻松解读数据库> 本章内容,主要讲解Activiti框架环境的搭建,能够使用Activiti的API创建23张数据库表,正式开始Activiti之旅. 在前一章,介绍了Activitie核心的数据库23张表的特征[数据库结构简介],在这里我们就要把Activiti集成到我们工程中了. 集成Activiti步骤如下: 1.从官网下载Activti框架包: 2.框架集成第一步都是导包,这些jar包可以在官方

Activiti入门 -- 环境搭建和核心API简介

本章内容,主要讲解Activiti框架环境的搭建,能够使用Activiti的API创建23张数据库表,正式开始Activiti之旅. 在前一章,介绍了Activitie核心的数据库23张表的特征[数据库结构简介],在这里我们就要把Activiti集成到我们工程中了. 集成Activiti步骤如下: 1.从官网下载Activti框架包: 2.框架集成第一步都是导包,这些jar包可以在官方包下找到: 由于Activiti使用了Spring框架的IOC机制,所以单独使用根目录下lib目录的包是不够的.

Activiti入门——轻松解读数据库

相关文章: <史上最权威的Activiti框架学习> <Activiti入门--环境搭建和核心API简介> 在Activiti中,相对前身JBPM基础上又额外多了5张,框架默认提供了23张表.今天这章来和大家分享一下关于Activiti数据库结构相关知识. 数据库 Activiti 的后台是有数据库的支持,所有的表都以 ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的 API 对应: ACT_GE_*: 通用数据, 用于存储上传文件信息和数据库版本信息: AC

activiti流程引擎 表结构分析

activiti5.15.0共有25张表,包括流程定义表(RE).一般数据信息表(GE).流程运行实例表(RU).流程历史记录表(HI).用户用户组表(ID).事件处理日志(EVT). Activiti的表都以ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的API对应. ACT_RE_*: 'RE'表示repository. 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等). ACT_RU_*: 'RU'表示runtime. 这些运行时的表,包含流程实例,任务

Activiti入门教程

1. 初识Activiti 1.1. 工作流与工作流引擎 工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现".(我的理解就是:将部分或者全部的工作流程.逻辑让计算机帮你来处理,实现自动化) 所谓工作流引擎是指workflow作为应用系统的一部分,并为之提

Activiti 入门示例

设置流程定义图bpmn     assignee :申请人.审核人 相关操作的表 -- act_re_procdef 流程定义表-- act_re_deployment 部署表 -- act_ge_property 通用属性表  id 生成策略  -- act_ru_execution  执行对象,流程实例,流程对象-- act_ru_task 任务表 入门示例: 1. 创建流程引擎及工作流数据表     - 数据库及表可以自动创建,       可以在配置数据库连接时,实现自动创建数据库和表 

Activiti入门 -- 轻松解读数据库

在Activiti中,相对前身JBPM基础上又额外多了5张,框架默认提供了23张表.今天这章来和大家分享一下关于Activiti数据库结构相关知识. 数据库 Activiti 的后台是有数据库的支持,所有的表都以 ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的 API 对应: ACT_GE_*: 通用数据, 用于存储上传文件信息和数据库版本信息: ACT_RE_*: 'RE'表示 repository. 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等): A

框架 day55 BOS项目练习(工作流,activiti入门)

BOS项目笔记第9天 内容: 1.工作流概念 2.安装eclipse插件(工作流流程设计器插件) 3.创建activiti框架提供的数据库表结构(23张表) 4.学习工作流框架API,操作流程 1.    工作流概念 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现".(按照某种预定义的规则来执