activiti流程开发基本步骤详解

合集下载

activiti工作流引擎的原理

activiti工作流引擎的原理

activiti工作流引擎的原理
Activiti工作流引擎是一个开源的业务流程引擎,它是基于Java的BPMN 2.0规范来实现的。

在工作流引擎实施的过程中,可以实现业务流程的定义、执行、协作以及监控。

Activiti工作流引擎的原理很简单,一般分为以下几个步骤:(1)设计和开发工作流:将业务流程抽象成工作流设计,编写XML描述工作流的XML文件,例如:用户创建一个新的工作流,并定义工作流流程的细节;
(2)创建工作流实例:在Activiti工作流引擎中,可以根据设计的工作流,创建一个新的工作流实例。

在创建新实例时,可以设置实例的参数,指定每一步由谁审批或执行,以及审批人之间的关系;
(3)执行工作流:在工作流实例创建完成之后,可以使用Activiti工作流引擎执行工作流,包括开始工作流实例,按照设计的流程执行各个节点,以及处理异常和结束实例等;
(4)监控工作流:Activiti工作流引擎可以监控工作流执行情况,例如,当前处于哪个步骤,执行者接收到任务,有哪些未被处理的任务等;
(5)管理工作流:Activiti工作流引擎提供了一些管理工作流实例的功能,例如,可以暂停工作流实例,可以激活工作流实例,可以更新工作流实例的参数,可以重新执行工作流实例;
(6)报表:Activiti工作流引擎可以根据实例执行情况,生成各类报表,例如,可以生成实例的执行轨迹,可以列出实例每一步的
执行者,未处理的任务,执行者之间的耗时和完成的实例等。

Activiti流程图部署及流程图部分操作

Activiti流程图部署及流程图部分操作

Activiti流程图部署及流程图部分操作 流程图部署有两种⽅式,⼀种是通过classpath,另⼀种是通过zip⽂件 通过classpath⽅式如下public void deploymentProcessDefinition_classpath(){Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署相关的service.createDeployment()//创建⼀个部署对象.name("流程定义⼊门")//添加部署名称.addClasspathResource("diagrams/helloworld.bpmn")//从calsspath中加载,⼀次⼀个.addClasspathResource("diagrams/helloworld.png").deploy();//完成部署System.out.println(deployment.getId());System.out.println(deployment.getName());} 通过zip压缩包代码如下public void deploymentProcessDefinition_zip(){InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");//从zip获得输⼊流ZipInputStream zipInputStream = new ZipInputStream(in);Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署相关的service.createDeployment()//创建⼀个部署对象.name("流程定义zip")//添加部署名称.addZipInputStream(zipInputStream)//指定zip格式⽂件完成部署.deploy();//完成部署System.out.println(deployment.getId());System.out.println(deployment.getName());} 查询流程定义代码如下public void findProcessDefinition(){List<ProcessDefinition> list = processEngine.getRepositoryService()//与流程定义和部署相关的service.createProcessDefinitionQuery()//查询流程定义表/**指定条件查询**///.deploymentId(deploymentId)//部署对象id查询//.processDefinitionId(processDefinitionId)//流程定义id查询//.processDefinitionKey(processDefinitionKey)//流程定义的key查询集合//.processDefinitionKeyLike(processDefinitionKeyLike)//流程定义的key模糊查询集合/**排序**///.orderByProcessDefinitionVersion().asc()//按版本升序//.orderByProcessDefinitionVersion().asc()//按版本升降序.list();//返回⼀个集合列表,封装流程定义//.singleResult();//返回惟⼀结果集//.count();//返回结果集数量//.listPage(firstResult, maxResults);//分页查询if(list!=null && list.size()>0){for(ProcessDefinition pd:list){System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机⽣成数System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn⽂件中的name属性值System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn⽂件中的id属性值System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1System.out.println("资源名称bpmn⽂件:"+pd.getResourceName());System.out.println("资源名称png⽂件:"+pd.getDiagramResourceName());System.out.println("部署对象ID:"+pd.getDeploymentId());System.out.println("#########################################################");}}} 删除流程定义代码如下,分为级联和⾮级联删除两种public void deleteProcessDefinition(){String deploymentId="601";//使⽤部署id完成删除/*** 不带级联的删除* 只能删除没有启动的流程,如果流程启动,就会抛出异常*///processEngine.getRepositoryService()// .deleteDeployment(deploymentId);//System.out.println("success");processEngine.getRepositoryService()//.deleteDeployment(deploymentId, true);System.out.println("删除成功!");} 查看流程图图⽚代码如下public void viewPic() throws IOException{/**将⽣成图⽚放到⽂件夹下*/String deploymentId = "1";//获取图⽚资源名称List<String> list = processEngine.getRepositoryService()//.getDeploymentResourceNames(deploymentId);//定义图⽚资源的名称String resourceName = "";if(list!=null && list.size()>0){for(String name:list){if(name.indexOf(".png")>=0){resourceName = name;}}}//获取图⽚的输⼊流InputStream in = processEngine.getRepositoryService()//.getResourceAsStream(deploymentId, resourceName);System.out.println(resourceName);//将图⽚⽣成到D盘的⽬录下File file = new File("D:/"+resourceName);//将输⼊流的图⽚写到D盘下FileUtils.copyInputStreamToFile(in, file);} 整体⽂件代码如下package b_processDefinition;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.zip.ZipInputStream;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.activiti.engine.repository.Deployment;import org.activiti.engine.repository.ProcessDefinition;import mons.io.FileUtils;import org.junit.Test;public class ProcessDefinitionTest {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定义,从classpath*/@Testpublic void deploymentProcessDefinition_classpath(){Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署相关的service .createDeployment()//创建⼀个部署对象.name("流程定义⼊门")//添加部署名称.addClasspathResource("diagrams/helloworld.bpmn")//从calsspath中加载,⼀次⼀个.addClasspathResource("diagrams/helloworld.png").deploy();//完成部署System.out.println(deployment.getId());System.out.println(deployment.getName());}/**部署流程定义,从zip*/@Testpublic void deploymentProcessDefinition_zip(){InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");//从zip获得输⼊流 ZipInputStream zipInputStream = new ZipInputStream(in);Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署相关的service.createDeployment()//创建⼀个部署对象.name("流程定义zip")//添加部署名称.addZipInputStream(zipInputStream)//指定zip格式⽂件完成部署.deploy();//完成部署System.out.println(deployment.getId());System.out.println(deployment.getName());}/**查询流程定义*/@Testpublic void findProcessDefinition(){List<ProcessDefinition> list = processEngine.getRepositoryService()//与流程定义和部署相关的service.createProcessDefinitionQuery()//查询流程定义表/**指定条件查询**///.deploymentId(deploymentId)//部署对象id查询//.processDefinitionId(processDefinitionId)//流程定义id查询//.processDefinitionKey(processDefinitionKey)//流程定义的key查询集合//.processDefinitionKeyLike(processDefinitionKeyLike)//流程定义的key模糊查询集合/**排序**///.orderByProcessDefinitionVersion().asc()//按版本升序//.orderByProcessDefinitionVersion().asc()//按版本升降序.list();//返回⼀个集合列表,封装流程定义//.singleResult();//返回惟⼀结果集//.count();//返回结果集数量//.listPage(firstResult, maxResults);//分页查询if(list!=null && list.size()>0){for(ProcessDefinition pd:list){System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机⽣成数System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn⽂件中的name属性值System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn⽂件中的id属性值System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1System.out.println("资源名称bpmn⽂件:"+pd.getResourceName());System.out.println("资源名称png⽂件:"+pd.getDiagramResourceName());System.out.println("部署对象ID:"+pd.getDeploymentId());System.out.println("#########################################################");}}}/**删除流程定义**/@Testpublic void deleteProcessDefinition(){String deploymentId="601";//使⽤部署id完成删除/*** 不带级联的删除* 只能删除没有启动的流程,如果流程启动,就会抛出异常*///processEngine.getRepositoryService()// .deleteDeployment(deploymentId);//System.out.println("success");processEngine.getRepositoryService()//.deleteDeployment(deploymentId, true);System.out.println("删除成功!");}/**查看流程图* @throws IOException */@Testpublic void viewPic() throws IOException{/**将⽣成图⽚放到⽂件夹下*/String deploymentId = "1";//获取图⽚资源名称List<String> list = processEngine.getRepositoryService()//.getDeploymentResourceNames(deploymentId);//定义图⽚资源的名称String resourceName = "";if(list!=null && list.size()>0){for(String name:list){if(name.indexOf(".png")>=0){resourceName = name;}}}//获取图⽚的输⼊流InputStream in = processEngine.getRepositoryService()//.getResourceAsStream(deploymentId, resourceName);System.out.println(resourceName);//将图⽚⽣成到D盘的⽬录下File file = new File("D:/"+resourceName);//将输⼊流的图⽚写到D盘下FileUtils.copyInputStreamToFile(in, file);}/***附加功能:查询最新版本的流程定义*/@Testpublic void findLastVersionProcessDefinition(){List<ProcessDefinition> list = processEngine.getRepositoryService()//.createProcessDefinitionQuery()//.orderByProcessDefinitionVersion().asc()//使⽤流程定义的版本升序排列.list();/*** Map<String,ProcessDefinition>map集合的key:流程定义的keymap集合的value:流程定义的对象map集合的特点:当map集合key值相同的情况下,后⼀次的值将替换前⼀次的值*/Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();if(list!=null && list.size()>0){for(ProcessDefinition pd:list){map.put(pd.getKey(), pd);}}List<ProcessDefinition> pdList = new ArrayList<ProcessDefinition>(map.values());if(pdList!=null && pdList.size()>0){for(ProcessDefinition pd:pdList){System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机⽣成数System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn⽂件中的name属性值System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn⽂件中的id属性值System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1 System.out.println("资源名称bpmn⽂件:"+pd.getResourceName());System.out.println("资源名称png⽂件:"+pd.getDiagramResourceName());System.out.println("部署对象ID:"+pd.getDeploymentId());System.out.println("#########################################################");}}}/**附加功能:删除流程定义(删除key相同的所有不同版本的流程定义)*/@Testpublic void deleteProcessDefinitionByKey(){//流程定义的keyString processDefinitionKey = "helloworld";//先使⽤流程定义的key查询流程定义,查询出所有的版本List<ProcessDefinition> list = processEngine.getRepositoryService()//.createProcessDefinitionQuery()//.processDefinitionKey(processDefinitionKey)//使⽤流程定义的key查询.list();//遍历,获取每个流程定义的部署IDif(list!=null && list.size()>0){for(ProcessDefinition pd:list){//获取部署IDString deploymentId = pd.getDeploymentId();processEngine.getRepositoryService()//.deleteDeployment(deploymentId, true);}}}}。

Activiti工作流入门详解完整教学教程

Activiti工作流入门详解完整教学教程

Activiti入门教程详解完整教程1.A ctiviti介绍Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。

Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss JBPM的项目架构师,它的特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。

1.1工作流引擎ProcessEngine对象,这是Activiti工作的核心。

负责生成流程运行时的各种实例及数据,监控和管理流程的运行。

1.2BPMN业务流程建模与标注(Business Process Model and Notation,BPMN),描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)2.准备环境2.1Activiti软件环境1)JDK1.6或者更高版本2)支持的数据库有:h2,mysql,oracle,mysql,db2等3)支持Activiti运行的jar包,可以通过maven依赖引入4)开发环境为Eclipse3.7或者以上版本,myeclipse为8.6版本2.2安装流程设计器(eclipse插件)1)打开Help →Install New Software →Add输入Name: Activiti DesignerLocation: /designer/update/输入完成后,单击OK按钮等待下载完成后安装。

安装完成后在菜单选项中会出现Activiti的目录选项2.3 设置eclipse activit插件的画流程图选项打开菜单Windows --> Preferences --> Activiti -->Save 下流程图片的生成方式勾选上Create process definition image when saving the diagram操作,勾选上这个操作后在画流程图后保存eclipse会自动生成对应的流程图片。

activity流程框架

activity流程框架

Activity流程框架的步骤和流程引言Activity流程框架是一种用于描述和管理业务流程的工具。

它可以帮助我们理清业务流程的各个环节,并确定每个环节的输入、输出、参与者和执行顺序。

本文将详细介绍Activity流程框架的步骤和流程,以确保流程清晰且实用。

什么是Activity流程框架Activity流程框架是一种基于活动(Activity)的流程描述方法。

它将业务流程分解为一系列的活动,并通过活动之间的关系来描述业务流程的执行顺序和条件。

Activity流程框架通常以图形的形式展示,其中每个活动由一个矩形框表示,活动之间的流程由箭头表示。

Activity流程框架的步骤和流程Activity流程框架的设计和实施通常包括以下步骤和流程:1. 确定业务流程的目标和范围在开始设计Activity流程框架之前,我们需要明确业务流程的目标和范围。

这包括确定业务流程的输入和输出,以及业务流程所涉及的参与者和资源。

通过明确业务流程的目标和范围,我们可以更好地理解业务需求,并为后续的流程设计做好准备。

2. 识别业务流程的活动在确定了业务流程的目标和范围之后,我们需要识别业务流程的活动。

活动是业务流程的基本单元,它代表了业务流程中的一个环节或任务。

通过识别活动,我们可以将复杂的业务流程分解为一系列的简单活动,从而更好地理解和管理业务流程。

3. 绘制Activity流程图在识别了业务流程的活动之后,我们需要将这些活动绘制成Activity流程图。

Activity流程图是Activity流程框架的主要表达方式,它通过图形的形式展示了活动之间的关系和执行顺序。

在绘制Activity流程图时,我们可以使用各种图形绘制工具,如UML工具、流程图工具等。

4. 定义活动的输入和输出每个活动都有一些输入和输出,它们是活动执行的基础和结果。

在设计Activity 流程框架时,我们需要明确每个活动的输入和输出,以确保活动之间的数据流和信息传递是清晰和准确的。

activity流程

activity流程

activity流程Activity流程是一种流程图,用于描述业务流程或系统流程。

它是一种非常常见的流程图,被广泛应用于软件开发、业务流程设计等领域。

Activity流程图可以帮助我们更好地理解业务流程或系统流程,从而更好地进行流程优化和改进。

下面,我们将详细介绍Activity流程的相关内容。

一、Activity流程的基本概念Activity流程是一种基于UML的流程图,它包括以下几个基本概念:1.活动(Activity):表示业务流程或系统流程中的一个步骤或操作。

2.开始(Start):表示业务流程或系统流程的开始。

3.结束(End):表示业务流程或系统流程的结束。

4.决策(Decision):表示业务流程或系统流程中的一个分支,用于判断流程的走向。

5.合并(Merge):表示业务流程或系统流程中的一个合并点,用于将分支汇聚。

6.流程线(Flow):表示业务流程或系统流程中的流程走向。

二、Activity流程的绘制方法Activity流程的绘制方法非常简单,只需要按照以下步骤进行即可:1.确定业务流程或系统流程的开始和结束。

2.确定业务流程或系统流程中的活动。

3.确定业务流程或系统流程中的决策和合并。

4.绘制流程线,将各个元素连接起来。

5.调整流程图的布局,使其更加清晰易懂。

三、Activity流程的优点Activity流程具有以下几个优点:1.易于理解:Activity流程图采用图形化的方式展示业务流程或系统流程,使得人们更容易理解和掌握。

2.易于优化:Activity流程图可以帮助我们发现业务流程或系统流程中的瓶颈和问题,从而更好地进行流程优化和改进。

3.易于沟通:Activity流程图可以帮助不同部门之间更好地沟通和协作,从而提高工作效率。

四、Activity流程的应用场景Activity流程图可以应用于以下几个场景:1.软件开发:Activity流程图可以帮助软件开发人员更好地理解软件系统的业务流程,从而更好地进行软件开发和测试。

activiti流程开发基本步骤详解

activiti流程开发基本步骤详解

activiti流程开发指南•一、BPMN•二、activiti主要接口•三、如何实现一个业务流程•四、如何管理所有流程与实例•五、开发流程•六、api一、BPMN1. 什么是BPMN首先BPMN规范是由标准组织BPMI发布的.BPMN 1.0规范发布于2004年5月。

此规范展示了BPMI组织两年多的努力成果。

BPMN的主要目标就是要提供被所有业务用户理解的一套标记语言,包括业务分析者、软件开发者以及业务管理者与监察者。

BPMN还将支持生成可执行的BPEL4WS语言。

所以,BPMN在业务流程设计与流程实现之间搭建了一条标准化的桥梁。

BPMN定义了业务流程图,其基于流程图技术,同时为创建业务流程操作的图形化模型进行了裁减。

业务流程的模型就是图形化对象的网图,包括活动(也可以说工作)和定义操作顺序的流控制。

2. BPMN基础业务流程图由一系列的图形化元素组成。

这些元素简化了模型的开发,且业务分析者看上去非常熟悉。

这些元素每个都有各自的特性,且与大多数的建模器类似。

比如,活动是矩形,条件是菱形。

应该强调的是:开发BPMN的动力就是为了在创建业务流程模型时提供一个简单的机制,同时又能够处理来自业务流程的复杂性。

要处理这两个矛盾的需求的方法就是将标记的图形化方面组织分类为特定的类别。

这里提供标记类别中的一小部分,以便业务流程图的读者可以简单地识别出元素的基本类型从而理解图形。

以下是四种基本的类型:1)流对象2)连接对象3)泳道4)人工信息BPMN2.0概要:/workclass/201206272.asp二、activiti主要接口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.getDefaultProcessEngine()会在第一次调用时初始化并创建一个流程引擎,以后再调用就会返回相同的流程引擎。

Activiti工作流学习(二)流程实例、执行对象、任务

Activiti工作流学习(二)流程实例、执行对象、任务

Activiti⼯作流学习(⼆)流程实例、执⾏对象、任务⼀.前⾔前⾯说明了基本的流程部署、定义,启动流程实例等基本操作,下⾯我们继续来学习流程实例、执⾏对象、任务。

⼆.流程实例、执⾏对象说明整个Activiti的⽣命周期经过了如下的⼏个步骤: 1.流程部署 ---> 2.启动流程实例 --- > 3.执⾏流程对象(⼀个流程实例包含多执⾏对象) ---> 4.完成整个流程说明:三.例⼦演⽰1.完成我的任务2.查询流程状态(判断流程正在执⾏,还是结束)3.查询历史任务4.流程实例、执⾏对象、任务四.对应数据库表------------------------------------------流程实例、执⾏对象、任务--------------------------------------------------正在执⾏的执⾏对象表-- 执⾏ID_ 56 流程实例ID_ 56 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 正在运⾏的任务定义ID_ 【可变】 USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6SELECT T.*, T.ROWID FROM ACT_RU_EXECUTION T;--流程实例历史表开始信息--历史流程定义ID_ 56 流程S实例ID_ 56 业务KEY_10000001 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 开始任务节点ID_ STARTEVENT52B3145F-C133-7B3D-F50F-E6D48BA60EAESELECT T.*, T.ROWID FROM ACT_HI_PROCINST T;--正在执⾏的任务对象表--任务ID_ 68 执⾏ID_ 56 流程实例ID_ 56 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 任务节点ID_ USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6SELECT T.*, T.ROWID FROM ACT_RU_TASK T;--历史任务流程实例信息--历史任务ID_ 68 流程实例ID_ 56 执⾏实例ID_ 56 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 任务节点ID_ USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6 表单KEY_ /PAGES/HOLIDAY/HOLIDAYMANAGE/H --历史任务ID_ 74 流程实例ID_ 56 执⾏实例ID_ 56 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 任务节点ID_ USERTASK04A84BE1-1133-7B3D-F511-1D0B7BB0A668 表单KEY_ /PAGES/HOLIDAY/HOLIDAYMANAGE/HO SELECT T.*, T.ROWID FROM ACT_HI_TASKINST T;--所有活动节点历史任务表--历史任务ID_58 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 流程实例ID_ 56 流程执⾏ID_ 56 任务节点ID_ STARTEVENT52B3145F-C133-7B3D-F50F-E6D48BA60EAE--历史任务ID_67 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 流程实例ID_ 56 流程执⾏ID_ 56 任务节点ID_ USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6 任务ID_ 68--历史任务ID_73 流程定义ID_ _3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 流程实例ID_ 56 流程执⾏ID_ 56 任务节点ID_ USERTASK04A84BE1-1133-7B3D-F511-1D0B7BB0A668 任务ID_ 74SELECT T.*, T.ROWID FROM ACT_HI_ACTINST T;五.流程变量模拟设置获取流程变量的场景设置流程变量获取流程变量流程变量对应数据库表----------------------------------------流程变量信息----------------------------------------------------正在执⾏的流程变量信息SELECT T.*, T.ROWID FROM ACT_RU_VARIABLE T;--历史流程变量信息存放历史表单重要信息--流程实例ID_ 56 执⾏实例ID_ 56 任务ID_SELECT T.*, T.ROWID FROM ACT_HI_VARINST T;历史意见信息、节点参与者信息(任务办理⼈)-------------------------------------------历史意见信息-------------------------------------------------历史审批意见表--任务ID_ 68 流程定义ID_ 56SELECT T.*, T.ROWID FROM ACT_HI_COMMENT T;-----------------------------------------节点参与者信息(任务办理⼈)---------------------------------------------------任务办理⼈表(个⼈任务、组任务)SELECT T.*, T.ROWID FROM ACT_RU_IDENTITYLINK T;--历史任务办理⼈表(个⼈任务、组任务)SELECT T.*, T.ROWID FROM ACT_HI_IDENTITYLINK T;。

activity 工作流详细介绍

activity 工作流详细介绍

activity 工作流详细介绍在软件开发中,很多应用需要处理一批活动,如订单的处理、审批流程、工作流等。

这时候,activity 工作流就成为了一个有效的工具。

它可以协调并管理大规模复杂的业务流程,能够帮助我们更快、更高效地处理各种业务。

本文将详细介绍 activity 工作流的工作原理和实现步骤。

步骤 1:创建 activity 工作流创建 activity 工作流需要借助 eclipse 等开发工具。

首先需要选择 activity 工作流项目的类型,然后创建 activity 文件。

接下来,需要添加 activity 的命令并进行流程控制的定义。

步骤 2:定义活动活动定义是工作流程设计的基本构建块,决定了最初的流程实现。

活动定义包括:名称、类型和相关事件。

在定义活动时,需要明确该活动的任务类型,例如:人工任务、服务任务和自动任务。

同时,还需要指定是否是并行的活动,以及是否会有分支和合并情况的出现。

步骤 3:定义事件在 activity 工作流中,事件是触发活动执行的关键。

事件定义包括:开始、中止、异常、结束等。

要使 activity 工作流更清晰、可维护,必须准确定义这些事件。

步骤 4:定义流程变量流程变量是 activity 工作流中的一个重要元素。

通过流程变量的设置,可以在活动定义阶段确定流程的方向,以及在后续的流程中激活相关的活动。

流程变量可以定义为整型、字符型、日期型等多种数据类型,使活动之间能够插入适当的逻辑和自定义规则。

步骤 5:定义流程流转流程流转是 activity 工作流的核心,也是设计工作中最具挑战性的部分。

在定义流程流转过程中,需要考虑各个活动的关联关系、优先级、策略等。

通过流程流转的设计,可以使整个工作流程更加完善,能够更有效地支持业务过程。

步骤 6:测试工作流工作流的开发完毕后,需要进行测试,以验证流程的行为和逻辑是否符合预期。

在测试过程中,需要进行全面的测试,覆盖各种场景和异常情况,确保 activity 工作流的可用性和可靠性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

activiti流程开发指南•一、BPMN•二、activiti主要接口•三、如何实现一个业务流程•四、如何管理所有流程与实例•五、开发流程•六、api一、BPMN1. 什么是BPMN首先BPMN规范是由标准组织BPMI发布的.BPMN 1.0规范发布于2004年5月。

此规范展示了BPMI组织两年多的努力成果。

BPMN的主要目标就是要提供被所有业务用户理解的一套标记语言,包括业务分析者、软件开发者以及业务管理者与监察者。

BPMN还将支持生成可执行的BPEL4WS语言。

所以,BPMN在业务流程设计与流程实现之间搭建了一条标准化的桥梁。

BPMN定义了业务流程图,其基于流程图技术,同时为创建业务流程操作的图形化模型进行了裁减。

业务流程的模型就是图形化对象的网图,包括活动(也可以说工作)和定义操作顺序的流控制。

2. BPMN基础业务流程图由一系列的图形化元素组成。

这些元素简化了模型的开发,且业务分析者看上去非常熟悉。

这些元素每个都有各自的特性,且与大多数的建模器类似。

比如,活动是矩形,条件是菱形。

应该强调的是:开发BPMN的动力就是为了在创建业务流程模型时提供一个简单的机制,同时又能够处理来自业务流程的复杂性。

要处理这两个矛盾的需求的方法就是将标记的图形化方面组织分类为特定的类别。

这里提供标记类别中的一小部分,以便业务流程图的读者可以简单地识别出元素的基本类型从而理解图形。

以下是四种基本的类型:1)流对象2)连接对象3)泳道4)人工信息BPMN2.0概要:/workclass/201206272.asp二、activiti主要接口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.getDefaultProcessEngine()会在第一次调用时初始化并创建一个流程引擎,以后再调用就会返回相同的流程引擎。

使用对应的方法可以创建和关闭所有流程引擎:ProcessEngines.init()和ProcessEngines.destroy()。

ProcessEngines会扫描所有activiti.cfg.xml和activiti-context.xml文件。

对于activiti.cfg.xml文件,流程引擎会使用Activiti的经典方式构建:ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream (inputStream).buildProcessEngine(). 对于activiti-context.xml文件,流程引擎会使用Spring方法构建:先创建一个Spring的环境,然后通过环境获得流程引擎。

所有服务都是无状态的。

这意味着可以在多节点集群环境下运行Activiti,每个节点都指向同一个数据库,不用担心哪个机器实际执行前端的调用。

无论在哪里执行服务都没有问题RepositoryService可能是使用Activiti引擎时最先接触的服务。

它提供了管理和控制发布包和流程定义的操作。

这里不涉及太多细节,流程定义是BPMN 2.0流程的java实现。

它包含了一个流程每个环节的结构和行为。

发布包是Activiti引擎的打包单位。

一个发布包可以包含多个BPMN 2.0 xml文件和其他资源。

开发者可以自由选择把任意资源包含到发布包中。

既可以把一个单独的BPMN 2.0 xml文件放到发布包里,也可以把整个流程和相关资源都放在一起。

(比如,'hr-processes'实例可以包含hr流程相关的任何资源)。

可以通过RepositoryService来部署这种发布包。

发布一个发布包,意味着把它上传到引擎中,所有流程都会在保存进数据库之前分析解析好。

从这点来说,系统知道这个发布包的存在,发布包中包含的流程就已经可以启动了。

除此之外,服务可以•o查询引擎中的发布包和流程定义。

o暂停或激活发布包,对应全部和特定流程定义。

暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。

o获得多种资源,像是包含在发布包里的文件,或引擎自动生成的流程图。

o获得流程定义的pojo版本,可以用来通过java解析流程,而不必通过xml。

正如RepositoryService负责静态信息(比如,不会改变的数据,至少是不怎么改变的),RuntimeService正好是完全相反的。

它负责启动一个流程定义的新实例。

如上所述,流程定义定义了流程各个节点的结构和行为。

流程实例就是这样一个流程定义的实例。

对每个流程定义来说,同一时间会有很多实例在执行。

RuntimeService也可以用来获取和保存流程变量。

这些数据是特定于某个流程实例的,并会被很多流程中的节点使用(比如,一个排他网关常常使用流程变量来决定选择哪条路径继续流程)。

Runtimeservice也能查询流程实例和执行。

执行对应BPMN 2.0中的'token'。

基本上执行指向流程实例当前在哪里。

最后,RuntimeService可以在流程实例等待外部触发时使用,这时可以用来继续流程实例。

流程实例可以有很多暂停状态,而服务提供了多种方法来'触发'实例,接受外部触发后,流程实例就会继续向下执行。

任务是由系统中真实人员执行的,它是Activiti这类BPMN引擎的核心功能之一。

所有与任务有关的功能都包含在TaskService中:•o查询分配给用户或组的任务o创建独立运行任务。

这些任务与流程实例无关。

o手工设置任务的执行者,或者这些用户通过何种方式与任务关联。

o认领并完成一个任务。

认领意味着一个人期望成为任务的执行者,即这个用户会完成这个任务。

完成意味着“做这个任务要求的事情”。

通常来说会有很多种处理形式。

IdentityService非常简单。

它可以管理(创建,更新,删除,查询...)群组和用户。

请注意,Activiti执行时并没有对用户进行检查。

例如,任务可以分配给任何人,但是引擎不会校验系统中是否存在这个用户。

这是Activiti引擎也可以使用外部服务,比如ldap,活动目录,等等。

FormService是一个可选服务。

即使不使用它,Activiti也可以完美运行,不会损失任何功能。

这个服务提供了启动表单和任务表单两个概念。

启动表单会在流程实例启动之前展示给用户,任务表单会在用户完成任务时展示。

Activiti支持在BPMN 2.0流程定义中设置这些表单。

这个服务以一种简单的方式将数据暴露出来。

再次重申,它时可选的,表单也不一定要嵌入到流程定义中。

HistoryService提供了Activiti引擎收集的所有历史数据。

在执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者,完成任务的时间,每个流程实例的执行路径,等等。

这个服务主要通过查询功能来获得这些数据。

ManagementService在使用Activiti的定制环境中基本上不会用到。

它可以查询数据库的表和表的元数据。

另外,它提供了查询和管理异步操作的功能。

Activiti的异步操作用途很多,比如定时器,异步操作,延迟暂停、激活,等等。

三、如何实现一个业务流程1. 静态表单(每个节点绘制对应的表单)o创建工作流实例(process_model)o创建每个节点的jsp表单一般以list页面弹出一个form表单页面就可以,至于表单的字段隐藏或者展示,由表单自己控制。

•o部署流程把process_model导出为BPMN.XML格式,再导入进行流程部署•开始流程保存业务实体leaveManager.saveLeave(entity);开始业务流程// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中identityService.setAuthenticatedUserId(entity.getUserId());//process为流程keyprocessInstance = runtimeService.startProcessInstanceByKey("process", businessKey,variables);•办理流程plete(taskId, variables);其中variables是可以传递在流程间的变量,通过Map<String, Object> variables = taskService.getVariables(taskId)可以获取那些变量。

•待办列表TaskQuery taskQuery =taskService.createTaskQuery().taskCandidateOrAssigned(userId);//自己办理或在该节点对应工作组中的流程•过程中列表ProcessInstanceQuery query =runtimeService.createProcessInstanceQuery().processDefiniti onKey("process").active().orderByProcessInstanceId().desc();List<ProcessInstance> list = query.listPage(pageParams[0], pageParams[1]);•已结束列表HistoricProcessInstanceQuery query =historyService.createHistoricProcessInstanceQuery().process DefinitionKey("process").finished().orderByProcessInstanceE ndTime().desc();List<HistoricProcessInstance> list =query.listPage(pageParams[0], pageParams[1]);四、如何管理所有流程与实例•查看所有已部署的流程repositoryService.createProcessDefinitionQuery().active().o rderByDeploymentId().desc();•查看所有待办tasks =taskService.createTaskQuery().active().orderByTaskId().desc ().list();个人待办tasks =taskService.createTaskQuery().taskCandidateOrAssigned(user.getId()).active().orderByTaskId().desc().list();•查看所有办理中ProcessInstanceQuery dynamicQuery =runtimeService.createProcessInstanceQuery().orderByProcessI nstanceId().desc().active();办理中(本人)ProcessInstanceQuery dynamicQuery =runtimeService.createProcessInstanceQuery().involvedUser(UserUtil.getUserFromSession(sessi on).getId()).orderByProcessInstanceId().desc().active();•查看所有已办HistoricProcessInstanceQuery dynamicQuery =historyService.createHistoricProcessInstanceQuery().finishe d().orderByProcessInstanceEndTime().desc();已办(本人)HistoricProcessInstanceQuery dynamicQuery =historyService.createHistoricProcessInstanceQuery().involve dUser(UserUtil.getUserFromSession(session).getId()).finishe d().orderByProcessInstanceEndTime().desc();五、开发流程1. 绘制流程图•单节点,多用户流程:必须设置下图红框属性,Multi-instance type 代表是单用户还是多用户,, Collection (Multi-instance),代表是用户的集合名称,需要在代码中设置Element variable (Multi-instance),集合中的属性,不需要设置。

相关文档
最新文档