zoukankan      html  css  js  c++  java
  • 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,接收人:老板
    --------------------------------

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


    流程实例和运行对象的差别   流程实例和运行对象 2个是不同的一个概念




    版权声明:本文博主原创文章。博客地址:http://blog.csdn.net/a67474506?

    viewmode=contents

  • 相关阅读:
    梯度下降
    最小二乘法模型的推导原理
    斗图啦+多线程(队列)
    scrapy错误-[scrapy.core.scraper] ERROR: Spider error processing
    python使用requests时报错requests.exceptions.SSLError: HTTPSConnectionPool
    AttributeError: module 'requests' has no attribute 'get'的错误疑惑
    *arg,**kwargs的参数作用的疑惑
    scrapy框架--新建调试的main.py文件
    Scrapy框架——安装以及新建scrapy文件
    爬虫-ajax请求遇到Unicode编码问题
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4797460.html
Copyright © 2011-2022 走看看