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 bpm 流程设计
activiti bpm 流程设计下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!Activiti BPM:解锁高效流程设计的利器在企业运营中,流程管理扮演着至关重要的角色。
activiti 概念
activiti 概念Activiti是一个开源的、基于Java的业务流程管理(BPM)框架。
它提供了一系列能够帮助企业实现业务流程自动化的功能,包括流程设计、流程执行、流程监控等。
本文将围绕Activiti的概念展开,逐步介绍Activiti 的主要特点、工作原理、核心组件以及与其他流程引擎的比较。
一、Activiti的概念Activiti是一个轻量级的、开源的、基于Java的BPM框架。
它具有以下主要特点:1. 灵活性:Activiti支持各种类型的流程、任务和事件,并且可以与现有的应用系统集成,以满足不同企业的需求。
2. 可扩展性:Activiti可以通过编写自定义的服务类和监听器来扩展其功能,以满足特定的业务需求。
3. 可视化设计:Activiti提供了一个图形化的设计器,可以方便地设计和修改流程模型。
4. 易于使用:Activiti的API简单易用,可以快速上手,并且提供了丰富的文档和示例。
二、Activiti的工作原理Activiti的工作原理是基于业务流程管理的各个环节进行自动化处理。
其主要过程如下:1. 流程设计:使用Activiti提供的图形化设计器,设计和绘制业务流程模型。
流程模型由一系列的活动、转移和网关组成,描述了流程的执行顺序和条件。
2. 流程部署:将流程模型部署到Activiti的运行环境中,生成流程定义。
流程定义包括处理任务的路由和执行逻辑等信息。
3. 流程执行:根据流程定义,Activiti会实例化一个流程实例,并按照流程模型中定义的顺序和条件来执行活动。
4. 任务处理:在流程执行过程中,会产生一系列的待处理任务。
这些任务会分配给相应的参与者,并通过任务管理功能进行处理。
5. 流程监控:Activiti提供了一个监控系统,可以实时查看流程的执行情况和各个活动的状态。
三、Activiti的核心组件Activiti的核心组件包括流程引擎、流程仓库、运行时服务、任务服务以及监控服务。
Activiti使用步骤(IDEA)
Activiti使⽤步骤(IDEA)⼀.Activiti7体系架构通过加载activiti.cfg.xml⽂件得到ProcessEngineConfiguration对象,通过ProcessEngineConfiguration对象可以得到ProcessEngine对象得到该对象后,可以通过流程引擎对象ProcessEngine来得到各种Service,每⼀种Service接⼝有每个⽤途RepositoryService activiti 的资源管理类RuntimeService activiti 的流程运⾏管理类TaskService activiti 的任务管理类HistoryService activiti 的历史管理类ManagerService activiti 的引擎管理类⼆.Activiti使⽤步骤1.流程定义使⽤Activiti Designer⼯具创建流程图新建⼀个BPMNFile流程图,可更改该流程图的ID 和每个任务环节的执⾏⼈,流程图就是⼀个xml⽂件,每⼀个流程需要⽣成⼀张流程图保存, ⾸先将.bpmn⽂件改为.xml⽂件 然后右键该xml⽂件Diagrams--->show BPMN 2.0 Designer就能⽣成⼀张流程图, 将流程图导出保存到项⽬对应⽬录即可,然后将xml改回bpmn即可2.流程部署需要将流程部署到Activiti当中,代表当前有该流程/*** 流程部署* `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程⽂件信息* `act_re_deployment` 流程部署信息,包含流程名称,ID,Key等* `act_re_procdef` 流程定义信息*/@Testpublic void deployment() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取RepositoryService对象进⾏流程部署RepositoryService repositoryService = processEngine.getRepositoryService();//进⾏部署,将对应的流程定义⽂件⽣成到数据库当中,作为记录进⾏保存Deployment deployment = repositoryService.createDeployment().addClasspathResource("bpmn/holiday.bpmn") //加载流程⽂件.addClasspathResource("bpmn/holiday.png").name("请假流程") //设置流程名称.key("holidayKey").deploy(); //部署//输出部署信息System.out.println("流程名称:" + deployment.getName());System.out.println("流程ID:" + deployment.getId());System.out.println("流程Key:" + deployment.getKey());}3.创建流程实例流程定义相当于类流程实例相当于类的实例(对象)/*** 启动流程实例* `act_hi_actinst` 已开始和执⾏完毕的活动信息* `act_hi_identitylink` 历史参与者信息* `act_hi_procinst` 流程实例信息* `act_hi_taskinst` 历史任务实例* act_ru_execution 任务执⾏信息* act_ru_identitylink 当前任务参与者* `act_ru_task` 任务信息*/@Testpublic void startInstance() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取到RuntimeService对象RuntimeService runtimeService = processEngine.getRuntimeService();//创建流程实例ProcessInstance holiday = runtimeService.startProcessInstanceByKey("myProcess_1");//红字是流程图的key值//输出实例信息System.out.println("流程部署ID:" + holiday.getDeploymentId());System.out.println("流程实例ID:" + holiday.getId());System.out.println("活动ID:" + holiday.getActivityId());}执⾏效果:`act_hi_actinst` 已开始和执⾏完毕的活动信息`act_hi_identitylink` 历史参与者信息`act_hi_procinst` 流程实例信息`act_hi_taskinst` 历史任务实例* act_ru_execution 任务执⾏信息* act_ru_identitylink 当前任务参与者* `act_ru_task` 任务信息4.⽤户查询代办任务/*** 查看代办任务*/@Testpublic void getTask() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfigurationProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取⼀个TaskService对象TaskService taskService = processEngine.getTaskService();//查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执⾏者 processDefinitionKey:查询流程/*** taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn⽂件中定义的值* taskAssignee匹配规则:1.Assigned*//*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();*/List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess_1").list();//分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);for (Task task : list) {System.out.println("任务名称:" + task.getName());System.out.println("任务执⾏⼈:" + task.getAssignee());System.out.println("任务ID:" + task.getId());System.out.println("流程实例ID:" + task.getProcessInstanceId());}}5.⽤户进⾏任务处理/*** 任务处理:当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看到该信息*/@Testpublic void completeTask() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取⼀个TaskService对象TaskService taskService = processEngine.getTaskService();//任务处理plete("2505");}先查看代办任务,再调⽤ plete(); ⽅法传⼊代办ID任务就被处理掉了上⼀步zhangsan被处理掉了,没有了代办任务,再查找zhangsan的下⼀步,lisi的代办任务发现lisi有了代办任务,数据库表也更新了处理完所有流程后ru表就为空了,数据都保存到了hi历史表6.流程结束7.当业务流程结束后通过历史可以查看到已经⾛完的流程/*** 查看历史任务*/@Testpublic void getHistory() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取HistoryService接⼝HistoryService historyService = processEngine.getHistoryService();//获取历史任务HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();//获取指定流程实例的任务historicActivityInstanceQuery.processInstanceId("2501");//获取任务列表List<HistoricActivityInstance> list = historicActivityInstanceQuery.list();for (HistoricActivityInstance ai : list) {System.out.println("任务节点ID:"+ai.getActivityId());System.out.println("任务节点名称:"+ai.getActivityName());System.out.println("流程实例ID信息:"+ai.getProcessDefinitionId());System.out.println("流程实例ID信息:"+ai.getProcessInstanceId());System.out.println("==============================");}}。
记Activiti入门使用-2流程绘制、导入及开始一个流程
记Activiti⼊门使⽤-2流程绘制、导⼊及开始⼀个流程⼀、流程绘制与导⼊百度啥的找了好多bpmn绘制⼯具,都不尽如⼈意,⼤多数都不能编辑⽹关出⼝的跳转条件,最后还是选择了activiti官⽅的那个绘图的app。
啥都好,就是线不能弯,很难受。
(后来开发的时候惊讶地发现了⽅法,虽然感觉操作不是很友好)要是有好⽤的希望⼤家能够推荐⼀下~下⾯Old Version选择,下载完成后是⼀个zip包,解压后把⾥⾯的activiti-app.war丢到tomcat下⾯启动就⾏,这边使⽤tomcat8.5.49,该war包需要java1.8。
(这边⽤idea直接起war包好像会遇到⼀系列问题,主要是contentPath会变,所以还是直接丢到tomcat下⾯吧)。
1、2、然后选择Create Process3、新建页⾯如下:Model name为流程名称(可重复)Model key为流程Key,实际调⽤中使⽤的即为该key,似乎key可以相同,但是后⾯创建的会有版本号的概念,会⾃动+14、画图就完事了,绘图规则可以⾃⾏了解bpmn5、保存后选择下载,放⼊⼯程⽬录/resources/processes下,修改后缀为bpmn,其实应该是可以直接解析bpmn20.xml⽂件的来着,具体的还在学习~启动项⽬出现:The following process definition files will be deployed: [***.bpmn]即说明流程部署成功。
⼆、如何开始⼀个流程我们以上图的流程为例,这边先提⼏个关键的service类2.1 服务接⼝1、TaskService 在流程进⾏过程中,每个节点的操作⽅法,经常⽤的⽐如:查询处于“领导审批”这个节点的任务,完成这个任务等等。
2、RuntimeService 流程相关服务,基本的功能例如:开始⼀个实例流程等等。
3、RepositoryService 流程部署相关的服务4、HistoryService 历史流程相关的服务2.2 开始流程 如上所说,开始流程我们需要⽤到RuntimeService这个类。
activiti工作流原理
activiti工作流原理Activiti是一个基于Java的开源工作流引擎,用于管理和执行业务流程。
它遵循BPMN 2.0规范,提供了一套完整的工作流管理功能。
工作流引擎的原理是将业务流程抽象成可执行的流程模型,并通过运行时执行引擎来管理和执行这些流程模型。
以下是Activiti工作流引擎的原理:1. 流程定义:工作流的基本单位是流程定义,它是一个可执行的模型,描述了业务流程的各个步骤和在这些步骤间的流程流转条件。
流程定义可以使用BPMN2.0规范的图形化编辑器进行设计和定义。
2. 流程部署:流程定义需要被部署到工作流引擎中才能被执行。
部署过程包括将流程定义的XML文件和相关的资源文件上传到工作流引擎,并生成相应的数据库表和其他必要的配置。
3. 流程实例化:当流程定义被部署后,可以通过工作流引擎的API来实例化一个流程,创建一个流程实例。
每个流程实例都是根据流程定义创建的,它代表了一个业务流程的具体执行状态。
4. 任务分配:在流程实例化后,流程中的各个步骤被转换为任务节点。
任务节点定义了需要由哪个用户或用户组来执行该步骤,并在任务节点上生成相应的待办任务。
5. 任务执行:工作流引擎根据任务节点的定义将待办任务分配给相应的执行者,并通过API提供相应的方法来执行任务。
执行者可以在任务界面上处理任务并提交执行结果。
6. 流程流转:在任务执行过程中,工作流引擎根据事先定义好的流程流转条件来控制流程的流转。
当一个任务被完成时,工作流引擎会根据流程定义中的条件判断,决定下一个要执行的任务是哪一个。
7. 监控和管理:工作流引擎可以提供监控和管理功能,用于跟踪和管理流程实例的执行情况。
监控和管理功能可以通过工作流引擎的管理控制台或API来实现。
通过以上原理,Activiti工作流引擎实现了一套完整的工作流管理和执行功能,可以帮助企业提高业务流程的效率和可控性。
activiti工作流基础方法
activiti工作流基础方法
Activiti是一个基于Java的工作流引擎,它提供了一套丰富的API来支持工作流的定义、部署、运行和管理。
以下是Activiti工作流的一些基础方法:
1. 部署流程定义:使用Deployment API可以将BPMN 流程定义文件部署到Activiti引擎中。
部署完成后,可以获取到流程定义的ID,并使用该ID 进行流程实例的创建。
2. 创建流程实例:使用ProcessInstance API可以创建一个新的流程实例。
在创建流程实例时,需要指定流程定义的ID、流程的起始节点ID以及其他相关参数。
3. 启动流程实例:一旦流程实例创建成功,可以使用Start API启动流程实例。
启动后,流程将按照定义的流程逻辑开始执行。
4. 执行任务:在流程执行过程中,会涉及到多个任务节点的处理。
使用Task API可以获取当前任务节点的相关信息,并进行任务的处理。
5. 完成任务:完成任务节点后,需要使用Task API将任务状态更新为已完成。
同时,根据流程定义中的规则,可能会自动创建新的任务节点或者触发其他事件。
6. 查询流程实例:使用ProcessInstance API可以查询指定ID的流程实例的状态信息,包括当前节点、历史记录等。
7. 查询任务:使用Task API可以查询指定ID的任务节点信息,包括任务状态、处理人等。
8. 删除流程实例:当流程实例执行完毕或者需要终止流程时,可以使用Delete API删除流程实例。
以上是Activiti工作流的一些基础方法,它们提供了对流程定义、部署、执行和管理的全面支持,可以帮助您轻松实现工作流的自动化和管理。
activiti用法
activiti用法Activiti是一个基于Java的开源工作流引擎,它提供了完整的工作流程概念和一套完善的管理工具,包括典型的BPMN 2.0图形建模,在业务处理和应用开发中有着广泛的应用。
以下是使用Activiti的详细步骤:1.安装和配置Activiti首先,需要将Activiti工作流引擎下载并且解压缩,然后在应用程序中添加相关依赖。
在Spring框架中集成Activiti,只需要在Spring配置文件中添加Activiti相应的XML配置即可。
2.设计和部署应用程序在Activiti中,首先需要设计和构建工作流流程,通过Activiti Designer可以轻松地进行BPMN 2.0流程图的设计。
设计好后,将其导出为XML文件并部署到Activiti Engine中。
在Activiti中可以通过REST API来部署工作流程。
另外,也可以在命令行中执行相关的命令来部署工作流程。
3.使用Activiti API开发可以在应用程序中通过Activiti API来访问Activiti Engine提供的相关操作。
首先,需要创建流程引擎,之后可以使用它来访问Activiti工作流引擎。
然后,可以使用Activiti的API来启动流程实例、查询任务、完成任务等操作,在具体实现中,需要使用Activiti提供的Java代码段来完成相应的工作。
4.监控和管理在Activiti中,可以使用Activiti Explorer或者Activiti Admin应用程序来监控和管理工作流流程。
可以使用Activiti Explorer来查看/管理实例、任务、用户、组等信息,也可以在Activiti Admin中进行高级的调优和监控操作。
5.测试和优化在完成Activiti的开发之后,需要进行全面的测试和优化。
可以使用Junit来进行单元测试,使用性能测试工具来检测系统在高负载条件下的性能表现等。
可以通过具体的优化方案来提高Activiti系统的性能和稳定性,例如使用缓存、对数据库进行优化等方法。
activiti源码分析
ExecutionEntity内部含有parent,是一个执行树或执行路径,应该是一个流程实例的执行过程,一个实例对应一个ExecutionEntity,通过getActivity得到的是当前正在执行的activity.Activiti之流程部署:流程文件部署主要涉及到3个表,分别是:ACT_GE_BYTEARRAY、ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF。
主要完成“部署包”-->“流程定义文件”-->“所有包内文件”的解析部署关系流程定义的部署需要完成如下操作:●初始化到数据库,完成三张表的插入,一个部署包里可以有N个流程定义,所以PROCDEF表内对应N条数据,BYTEARRAY表内对应N+条记录,每个xml文件一条记录,图片也会另外存放一条记录。
DEPLOYMENT内会存放一条记录●解析后的流程定义存入DeploymentCache流程部署的序列图:repositoryService DeploymentBuilder commandExecutor DeploymentManager DbSqlSession ResourceManager DeploymentCache createDeploymentexecute(new DeployCmd(deploymentBuilder))insertDeployment(DeploymentEntity)insert(DeploymentEntity)流程部署已后,启动流程时,会调用StartProcessInstanceCmd,来启动流程。
StartProcessInstanceCmd在查找ProcessDefinitionEntity时,会从deploymentCache 中查找,当cache中不存在时,会执行deploymentCache.deploy()Activiti之Query查询:缓存查询:Activiti 之manager:创建流程实例:创建流程实例:runtimeService.startProcessInstanceByKey("financialReport") 执行步骤:1.0 首先根据” financialReport”在数据库中查找流程定义2.0 查找到流程定义后,再从processDefinitionCache 中获取已经缓存的、部署完成的(xml文件被解析的)流程定义,如果processDefinitionCache 中不存在,那么执行流程的解析过程query+++++++升续 ()降续 ()list ()listPage ()Operation_5 ()singleResult ()count ()userQuery+++++userId ()userFirstName ()userEmail ()memberOfGroup ()orderByUserId ()...: userQuery : userQuery : userQuery : userQuery : userQueryCommand+execute (CommandContext context): TAbstractQuery++++++升序 ()降序 ()list ()listPage ()count ()sigleResult ()UserQueryImplTaskQueryTaskQueryImplsession ++flush ()close ()...AbstractManager++++insert (PersistentObject record)delete (PersistentObject record)getDbSqlSession ()getManager ()TaskManager++deleteTask ()findTask (): TaskEntityExecutionManager+++++deleteProcessInstances ()findProcessInstance ()findExecutions ()findChildExecutions ()findSubProcessInstance ()...: ProcessInstance : ExecutionEntity : ExecutionEntity : ExecutionEntity3.0创建流程实例代码执行过程:1.AtomicOperation:org.activiti.engine.impl.pvm.runtime.AtomicOperationProcessStart2.AtomicOperation:org.activiti.engine.impl.pvm.runtime.AtomicOperationProcessStartInitial 3.AtomicOperation:org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute4.ProcessInstance[805] executes Activity(theStart):org.activiti.engine.impl.bpmn.behavior.NoneStartEventActivityBehavior 5.Leaving activity 'theStart'流程启动:流程启动执行:ExecutionEntity.performOperation(AtomicOperation.PROCESS_START) ,接着执行:execution.performOperation(PROCESS_START_INITIAL);接着执行:execution.performOperation(ACTIVITY_EXECUTE);其内部执行逻辑为:ActivityBehavior activityBehavior = activity.getActivityBehavior();activityBehavior.execute(execution);activityBehavior有很多的实现类,比如:当流程启动时,启动节点的activityBehavior实际上是NoneStartEventActivityBehavior的实例。
Activiti7_流程实例
Activiti7_流程实例什么是流程部署?参与者(可以是⽤户也可以是程序)按照流程定义内容发起⼀个流程,这就是⼀个流程实例。
是动态的。
流程定义和流程实例的图解流程部署使⽤压缩包的⽅式部署流程1/**2 * 压缩包的⽅式部署流程3*/4 @Test5public void deploymentByZip(){6//获取processEngine对象7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();8//获取⼀个RepositoryService对象9 RepositoryService repositoryService = processEngine.getRepositoryService();10//定义⼀个输⼊流,加载Zip⽂件11 InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("flowchart/process.zip");12//定义⼀个ZIPInputStream对象13 ZipInputStream zipInputStream=new ZipInputStream(inputStream);14//流程部署15 Deployment deploy = repositoryService.createDeployment()16 .addZipInputStream(zipInputStream)17 .name("请求审批流程")18 .key("processKey")19 .deploy();20 System.out.println("流程名称:"+deploy.getName());2122 }压缩包的⽅式部署流程结果流程定义的查看流程定义信息的查看1/**2 * 流程定义信息的查看3*/4 @Test5public void getProDef(){6//获取processEngine对象7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();8//获取⼀个RepositoryService对象9 RepositoryService repositoryService = processEngine.getRepositoryService();10//得到流程定义查看对象ProcessDefinitionQuery11 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();12//指定查看的流程 processDefinitionKey()指定流程定义的key值 orderByProcessDefinitionVersion根据流程定义版本号排序13 List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("myProcess").orderByProcessDefinitionVersion().desc().list(); 14for (ProcessDefinition proDef:holiday) {15 System.out.println("流程定义ID:"+proDef.getId());16 System.out.println("流程定义的名称:"+proDef.getName());17 System.out.println("流程定义的Key:"+proDef.getKey());18 System.out.println("流程定义的版本号:"+proDef.getVersion());19 }20 }流程定义信息的查看结果流程删除1/**2 * 删除流程:3 * 假设在删除时,当前正在有该流程实例执⾏,那么会导致删除失败4 * 如果强制要求,则可以使⽤repositoryService.deleteDeployment("1",true); true代表级联删除5*/6 @Test7public void deleteDeployment(){8//获取processEngine对象9 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();10//获取⼀个RepositoryService对象11 RepositoryService repositoryService = processEngine.getRepositoryService();12//删除流程13 repositoryService.deleteDeployment("1",true);14 }删除流程结果获取数据库中流程资源信息1/**2 * 从数据中读取资源⽂件到本地3*/4 @Test5public void getResource() throws IOException {6//获取processEngine对象7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();8//获取⼀个RepositoryService对象9 RepositoryService repositoryService = processEngine.getRepositoryService();10//获取到流程查询对象11 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();12//获取到流程资源13 processDefinitionQuery.processDefinitionKey("myProcess");14//获取单⼀结果15 ProcessDefinition processDefinition = processDefinitionQuery.singleResult();16//流程部署的ID17 String deploymentId = processDefinition.getDeploymentId();18//获取到bpmnResource19 InputStream bpmnStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());20//获取到png21 InputStream pngStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());22//构建输出流23 OutputStream bpmnOut = new FileOutputStream("D:\\北⼤青鸟作业\\2020年的练习\\20200402\\" + processDefinition.getResourceName());24 OutputStream pngOut = new FileOutputStream("D:\\北⼤青鸟作业\\2020年的练习\\20200402\\" + processDefinition.getDiagramResourceName()); 25//将数据输出到磁盘当中26 IOUtils.copy(bpmnStream,bpmnOut);27 IOUtils.copy(pngStream,pngOut);28//关流29 pngOut.close();30 bpmnOut.close();31 pngStream.close();32 bpmnStream.close();33 }从数据中读取资源⽂件到本地注意:IOUtils.copy()⽅法是import mons.io.IOUtils;下的⽅法不是import sun.misc.IOUtils;结果业务系统和流程系统进⾏关联通过buessinessKey字段标识业务系统的主键数据ID,进⽽表名当前业务执⾏到了哪⼀个流程1/**2 * 启动流程实例和业务系统关联3 * 正常应该先添加数据到业务表当中,拿到当前添加数据的主键ID,通过启动流程实例,将主键ID交给BuessniessKkey4 * 代表和流程系统进⾏关联5*/6 @Test7public void startInstance(){8/**9 * 让张三在页⾯提交,然后拿到ID10*/1112/**13 * 创建张三请假的实例流程14*/15//获取processEngine对象16 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();17 RuntimeService runtimeService = processEngine.getRuntimeService();18//⽣成流程19 ProcessInstance holiday = runtimeService.startProcessInstanceByKey("myProcess","2");2021/**22 * 张三提交请假审批23*/24//获取⼀个TaskService对象25 TaskService taskService = processEngine.getTaskService();26//获取张三的任务27 Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess").singleResult();28//任务审批29 plete(task.getId());30 }启动流程实例和业务系统关联结果:流程激活和挂起所有流程定义的挂起1/**2 * 所有流程定义的挂起3*/4 @Test5public void allSuspend(){6//获取processEngine对象7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();8//获取repositoryService对象9 RepositoryService repositoryService = processEngine.getRepositoryService();10//获取流程定义11 ProcessDefinition holiday = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess").singleResult(); 12//获取到当前流程定义是否为暂停状态 suspended⽅法为true代表为暂停 false就是运⾏的13boolean suspended = holiday.isSuspended();14if(suspended){15 repositoryService.activateProcessDefinitionById(holiday.getId(),true,null);16 System.out.println("该流程定义激活");17 }else{18 repositoryService.suspendProcessDefinitionById(holiday.getId(),true,null);19 System.out.println("该流程定义暂停");20 }21 }所有流程定义的挂起第⼀次运⾏结果第⼆次运⾏结果单个流程实例的挂起1/**2 * 单个流程实例的挂起3*/4 @Test5public void singleSuspend(){6//获取processEngine对象7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();8//获取RuntimeService对象9 RuntimeService runtimeService = processEngine.getRuntimeService();10 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("5001").singleResult(); 1112//获取到当前流程定义是否为暂停状态 suspended⽅法为true代表为暂停 false就是运⾏的13boolean suspended = processInstance.isSuspended();14if(suspended){15 runtimeService.activateProcessInstanceById("5001");16 System.out.println("xx的请假流程激活");17 }else{18 runtimeService.suspendProcessInstanceById("5001");19 System.out.println("xx的请假流程挂起");20 }21 }单个流程实例的挂起第⼀次运⾏结果第⼆次运⾏结果。
activiti部署与流程删除相关
activiti部署与流程删除相关Activiti是一个流程引擎,它提供了一套完整的流程管理解决方案。
Activiti的部署和流程删除是Activiti流程管理的重要功能之一、本文将详细介绍Activiti部署和流程删除的相关内容。
一、Activiti部署Activiti的部署是指将流程定义和流程资源发布到Activiti引擎中,以便后续可以使用这些定义来创建和执行流程实例。
Activiti支持多种方式的部署,包括手动部署和自动部署。
1.手动部署手动部署是指将流程定义和流程资源手动上传到Activiti引擎中。
手动部署需要通过Activiti的API或者管理界面来完成,具体步骤如下:(1)创建一个流程定义文件,通常使用BPMN2.0规范进行定义;(2)将流程定义文件上传到Activiti引擎中,可以使用Activiti提供的API或者管理界面进行上传;(3)部署成功后,Activiti会生成一个Deployment对象,该对象包含了部署相关的信息,如部署ID、部署时间等。
2.自动部署自动部署是指将流程定义和流程资源自动发布到Activiti引擎中。
Activiti提供了多种自动部署的方式,包括基于文件、基于类路径和基于数据库等。
具体步骤如下:(1)将流程定义文件放置在指定的目录下,或者将流程定义文件打包成一个jar包;(2)配置Activiti引擎,指定自动部署的方式和相关参数;(3)启动Activiti引擎后,它会自动扫描指定目录下的流程定义文件或者jar包,并将其发布到引擎中;(4)自动部署成功后,可以通过Activiti的API或者管理界面查看相关的部署信息。
二、流程删除流程删除是指将已经部署到Activiti引擎中的流程定义和流程实例删除。
Activiti提供了多种方式的流程删除,包括删除部署、删除流程实例和级联删除等。
1.删除部署删除部署是指将已经部署的流程定义和流程资源从Activiti引擎中删除。
activiti工作流原理简单明了
Activiti是一款开源的工作流引擎,用于实现业务流程的自动化和管理。
其工作原理可以简单概括如下:
流程定义:在Activiti中,首先需要定义业务流程,通常使用BPMN(Business Process Model and Notation)标准进行建模。
流程定义包括各个步骤、任务、决策点等,以及它们之间的关系和顺序。
流程部署:将流程定义部署到Activiti引擎中,可以通过配置文件或编程方式进行部署。
部署后,流程定义会被解析为可执行的流程实例。
流程实例化:当需要启动一个新的业务流程时,根据流程定义创建流程实例。
流程实例是流程定义的一个具体实例,包含了流程中的各个步骤和任务。
任务分配:在流程中,任务会被分配给不同的参与者或角色。
Activiti可以根据预先定义的规则和条件来分配任务,也可以根据实时的数据和流程情况进行动态分配。
任务执行:参与者可以根据任务的要求和流程定义的指导执行任务,完成相关操作和提交必要的数据。
流程控制:流程中的控制流会根据预先定义的条件和规则进行控制,决定流程的走向。
例如,根据条件分支选择不同的路径,或根据某些条件触发并行任务等。
监控和管理:Activiti提供了监控和管理工具,可以跟踪和监控流程实例的状态、任务的执行情况,以及进行流程的调度和管理。
通过以上的工作流原理,Activiti实现了对业务流程的可视化、自动化和管理,帮助组织和企业提升效率、降低成本,并实现更好的业务控制和可追溯性。
activitiworkflow原理
activitiworkflow原理Activiti是一个开源的工作流引擎,用于管理和执行业务流程。
其原理可以概括为下述几个方面:1. 流程定义:Activiti使用BPMN2.0作为流程定义语言,用户通过定义一个XML格式的BPMN文件来描述业务流程。
这个文件包含了流程中涉及的各种任务、连线、条件和分支等元素。
2. 流程部署:当流程定义被创建好后,需要将其部署到Activiti引擎中进行管理和执行。
流程部署包括将BPMN文件部署到引擎中,并对其进行解析和转换成可执行的流程实例。
3. 流程实例:在流程定义被部署后,可以通过引擎创建流程实例。
流程实例表示一个流程定义的具体执行过程,包含了当前执行到的任务、变量等信息。
4. 任务分配:在流程执行过程中,任务会被分配给执行者,并通过引擎进行管理。
引擎根据流程定义中定义的人员角色和条件来确定任务的分配方式。
5. 任务执行:执行者通过Activiti提供的API来完成分配给自己的任务。
执行者可以查看任务详情、完成任务、提供任务相关的信息等操作。
6. 流程控制:Activiti引擎会根据流程定义中的连线和条件来控制流程的走向。
当一个任务被完成时,引擎会根据流程定义中定义的下一个任务来确定下一步的执行路径。
7. 监控和查询:Activiti提供了丰富的查询和监控功能,用于查看流程的状态、任务的执行情况和历史记录等。
用户可以通过这些功能来追踪和监控流程的整个执行过程。
总体来说,Activiti的工作流原理就是通过定义和管理流程定义,控制流程的执行,分配和执行任务,以及提供监控和查询功能,实现业务流程的自动化和管理。
activiti流程引擎
activiti流程引擎Activiti流程引擎。
Activiti是一个轻量级的工作流和业务流程管理(BPM)引擎,它是一个开源的、灵活的、可扩展的流程引擎,具有强大的工作流建模和管理能力。
本文将介绍Activiti流程引擎的基本概念、特点和使用方法。
1. Activiti流程引擎的基本概念。
Activiti流程引擎是基于BPMN 2.0标准的,它提供了流程定义、流程部署、流程实例、任务管理等核心概念。
流程定义是指业务流程的模型和规则,它由BPMN 2.0标准的图形化流程模型和XML文件组成。
流程部署是指将流程定义部署到Activiti引擎中,使其可以被实例化和执行。
流程实例是指流程定义的具体执行实例,每个流程实例都有自己的执行状态和数据。
任务管理是指对流程中的任务进行管理和执行,包括任务分配、任务处理和任务跟踪等功能。
2. Activiti流程引擎的特点。
Activiti流程引擎具有以下几个特点:灵活性,Activiti流程引擎支持多种流程模型和规则,可以根据业务需求灵活定制和调整流程模型。
可扩展性,Activiti流程引擎提供了丰富的API和插件机制,可以方便地进行扩展和定制开发。
性能优越,Activiti流程引擎采用了轻量级的设计和优化,具有较高的性能和并发处理能力。
易用性,Activiti流程引擎提供了图形化的流程设计器和管理界面,使流程的建模、部署和管理变得简单易用。
3. 使用Activiti流程引擎。
使用Activiti流程引擎通常包括以下几个步骤:流程建模,使用Activiti提供的流程设计器进行流程建模,包括定义流程模型、制定流程规则和配置流程属性等。
流程部署,将流程定义文件部署到Activiti引擎中,使其可以被实例化和执行。
流程执行,根据业务需求实例化流程定义,启动流程实例并监控流程执行状态。
任务处理,对流程中的任务进行管理和执行,包括任务分配、任务处理和任务跟踪等功能。
流程监控,对流程执行状态进行监控和跟踪,包括流程实例状态、任务状态和执行日志等信息。
activiti 7的用法
activiti 7的用法
Activiti 7是一个用于业务流程管理(BPM)的开源工作流引擎,它可以帮助您自动化和管理业务流程。
以下是Activiti 7的一些基本用法:
1.定义流程:您可以使用Activiti的建模工具或直接使用XML来定义流程。
定义流程包括定义流程的开始、结束、任务、活动等元素,以及它们之间的逻辑关系。
2.部署流程:一旦您定义了流程,您需要将其部署到Activiti引擎中。
您可以
使用Activiti的API或命令行工具来部署流程。
部署流程后,您可以启动流程实例并执行流程。
3.启动流程实例:您可以使用Activiti的API或用户界面来启动流程实例。
启
动流程实例时,您需要提供必要的参数,例如开始用户、流程变量等。
4.执行任务:当流程实例启动后,它会根据流程定义分配任务给用户或服务。
用户或服务可以执行这些任务,并将结果反馈给Activiti引擎。
5.管理流程实例:您可以使用Activiti的管理界面或API来管理流程实例。
您
可以查看流程实例的状态、执行情况、日志等信息,并根据需要进行干预或调整。
6.集成其他系统:Activiti可以与其他系统进行集成,例如数据库、文件系统、
邮件系统等。
您可以使用Activiti的API或适配器来与这些系统进行交互,实现业务流程的自动化和管理。
以上是Activiti 7的一些基本用法,具体用法可能会因您的业务需求和流程定义而有所不同。
activiti流程部署的各种方式
activiti流程部署的各种⽅式流程资源可以是各种类型的⽂件,在启动流程或流程实例运⾏过程中会被读取。
下⾯介绍常⽤的流程资源。
⼀、流程资源流程定义⽂件:扩展名为bpmn20.xml和bpmn;流程定义的图⽚:⽤BPMN2.0规范的各种图形描绘,⼀般⽤PNG的格式;表单⽂件:把表单内容保存在⼀个⽂件中,其扩展名为drl;规则⽂件:其扩展名为drl;⼆、部署流程资源部署流程资源有很多种⽅法,包括classpath、InputStream、字符串、zip格式压缩包,下⾯将⼀⼀介绍。
1.classpath⽅式public class ProcessDefinitionTest {/**流程引擎(核⼼对象),默认加载类路径下命名为activiti.cfg.xml*/ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//部署流程定义@Testpublic void deployementProcessDefinition(){Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service.createDeployment()//创建部署对象.name("helloworld演⽰")//声明流程的名称.addClasspathResource("diagrams/helloworld.bpmn")//加载资源⽂件,⼀次只能加载⼀个⽂件.addClasspathResource("diagrams/helloworld.png")//.deploy();//完成部署System.out.println("部署ID:"+deployment.getId());//1System.out.println("部署时间:"+deployment.getDeploymentTime());}}2.InputStream⽅式使⽤InputStream⽅式部署流程资源需要传⼊⼀个输⼊流及资源的名称,输⼊流的来源不限,可以从classpath读取,也可以从⼀个绝对路径⽂件读取,也可以是从⽹络上读取。
Activiti工作流的定义部署和执行
Activiti⼯作流的定义部署和执⾏⼯作流引擎个⼈觉得直接理解⼯作流引擎概念有点难度,我们可以先通过了解⼯作流引擎的职责再反过来理解⼯作流引擎,⼯作流引擎⼀般都做两件事情:1.定义流程,也就是给我们提供某种规范来定义规则,以及如何定义⼀个流程的这种规范,同事我们可以根据⼯作流引擎提供的相关概念来定义更为复杂的流程,这就是⼯作流引擎做的第⼀件事叫做定义流程。
2.执⾏流程,也就是⼯作流引擎需要解释这个规则,还要负责流程,它相当于流程的调度者,监控每个流程的执⾏情况,并将流程操作发往下⼀步,或者根据条件休眠或终⽌流程的这么⼀个过程就叫做执⾏流程。
了解完⼯作流引擎的这两个职责,我相信对于什么是⼯作流引擎⼀定已经有了⼀定的认识了,我们在⽤⼀句稍微有点官⽅的话来总结⼀下⼯作流引擎,⼯作流引擎为我们提供相关规则概念的定义,给我们提供了相关的API来调⽤这个引擎去执⾏流程。
流程的操作实际上就是⼯作流引擎提供相关的api我们去调⽤它。
⼯作流框架与⼯作流引擎上⾯我们提及了常见了⼏个⼯作流框架,其中现在的Activiti和JBPM5.0之前的版本都是基于ProcessEngine ⼯作流引擎的⼯作流框架;JBPM5.0开始是基于DroolsFlow为⼯作流引擎的⼯作流框架;其中OSWorkflow是以⼯作流引擎命名的⼯作流框架,所以OSWorkflow 是基于OSWorkflow⼯作流引擎的⼯作流框架;ActiveBPEL是基于⼯作流BPEL引擎的⼯作流框架…….到这⾥关于⼯作流的相关概念就介绍完了,接下来我们先了解⼀下我们的主⾓activiti的前世今⽣。
Activiti前世今⽣Activiti 的创始⼈是 Tom Baeyens 说到Tom Baeyens 就不能不提他与jbpm的渊源。
TomBaeyens 是 jBPM 的创始⼈,在 2002年,Tom Baeyens创建了基于状态机原理的jBPM流程引擎。
jBPM经过了JBoss和Redhat公司之后,发展到了 jBPM 4。
201834Activiti教程之流程部署篇(与Springboot整合版)二
201834Activiti教程之流程部署篇(与Springboot整合版)⼆⾸先我们来看下Activiti为我们⾃动⽣成的这四张⽤户相关的表先看下USER表我已经插⼊了⼀些数据,很明显,就是保存⽤户的信息的看下GROUP⽤户对应的分组信息MEMBERSHIP⽤户和分组的中间表,可以看出它们是多对多关系INFO这张表,看官⽅⽂档说的是保存⽤户额外信息,可以看到它有USER表的⼀个外键OK,表关系介绍完了,我们再来说下怎么添加⽤户信息吧其实这个很简单,SpringBoot对于Activiti的⽀持不错,已经给我们配置好了很多默认,直接注⼊就⾏IdentityService是专门⽤来针对⽤户信息做⼀些操作的。
现在我们已经成功插⼊了⼀条⽤户数据,接下来,我们部署我们的具体流程吧,也就是将我们之前画的流程图进⾏解析,并保存到数据库那么怎么部署呢?这样既可,再来看下数据库返回的是⼀个接⼝对象的实例接⼝具体源码它的实现这么Map对象是我们部署流程时添加的name对应当前流程实体类,看源码这样加⼀个name就⾏,这个其实⽆所谓,看你⾃⼰了看到这⾥,⼤家应该会有疑问,我们具体的流程图保存在哪⾥呢?第⼆个数据是我们流程图的静态图⽚,第⼀个数据才是我们的具体流程,应该能看出是⼀个xml⽂件的具体内容吧?有⼀点⼀定要注意的是我们这⾥Id和Name对应的是数据库中这个NAME_和KEY_,其实我⽐较奇怪的⼀点是为什么外国⼈喜欢加_这个符号啊 /⿊⼈问号脸如果重复添加相同key的流程那么就会在之前的基础上将版本+1当你想使⽤流程key去⾛流程的时候,也会⾃动⾛最⾼版本的这⾥有⼀个⽐较重要的字段,我得介绍⼀下此字段的意思为是否挂起,那么什么叫是否挂起呢?你想⼀下,现在你正在有⼀个流程在发布并且处于运⾏,然后现在你想创建⼀个新的流程,那么现在这个流程怎么办呢?当然是挂起了。
⽽在挂起之后,正处于流程中的⼈依然会⾛这个流程,之后的⼈则是⾛你发布的新流程(1为正常,2为挂起)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前面的文章介绍了Activiti在IDEA开发工具中的基本配置,本章我们将学习基本的BPMN知识以及Activiti的流程部署。
BPMN的介绍
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。
那什么是BPM和BPMN呢?
BPM:即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法,常见商业管理教育如EMBA、MBA等均将BPM包含在内。
BPMN:业务流程建模与标注,包括这些图元如何组合成一个业务流程图(Business Process Diagram)。
业务流程示意图是由一系列的元素符号构成。
作为BPMN的基础,这些符号将业务流程建模简单化、图形化,将复杂的建模过程视觉化,让阅读者对BPMN有一个更加清晰明了的了解。
既然BPMN 符号如此重要,那在绘制BPMN示意图之前,便必须要对BPMN符号的名称、意义、使用方法等有一个全面的理解。
BPMN的四种基本元素
●流对象(Flow Objects):包括事件、活动、网关,是BPMN的核心元素;
事件Event用一个圆圈表示,它是流程中运行过程中发生的事情。
事件的发生会影响到流程的流转.事件包含Start\Intermediate\End三种类型.如下图:
活动Activities用圆角矩形表示,一个活动多个活动组成,活动的类型分为Task和Sub-Process。
如下下图:
网关Gateway用菱形表示,用于控制流程的分支和聚合.具体符号表示如下:
●连接对象(Connecting Objects):包括顺序流、消息流、关联;
●泳道(Swimlanes):包括池和道两种类型;
●人工信息(Artifacts):包括数据对象、组、注释。
Activiti的流程部署
下面介绍在IDEA中如何部署一个简单的考勤补签流程
1、首先在resource目录下新建bpmn目录
2、点击bpmn目录右键——>new——>bpmn文件,输入bpmn文件名后会出现如下界面:
该界面的左边是属性面板,可以查看和修改各个bpmn元素的属性值,中间是bpmn流程图,最右侧是流程图中的各种元素。
3、绘制流程图
1)拖放一个StartEvent(开始事件)和一个EndEvent(结束事件)到流程图中,分别将名称设置为“补签开始”和“补签结束”。
2)拖放两个UserTask,分别将名称设置为技术经理审批和人事专员确认
3)将图形连接起来,如上图,提示:将鼠标移动到图形中心,图标形状会发生变化,然后拖动到下一个图形就完成了连接。
4、生成流程图png图片
部署一个Activiti流程需要bpmn文件和流程图图片(png格式),可以复制bpmn文件然后将后缀名改为xml,在xml文件上点击右键——>Diagrams——>Show BPMN2.0Designer会出现如下界面:
点击左上方的导出按钮,选择resources下的bpmn目录,就会保存为png图片。
5、部署流程
上章介绍过Activiti的核心引擎ProcessEngine,所有的服务都需要通过流程引擎来获得。
部署流程需要使用RepositoryService,仓库服务是存储相关的服务,一般用来部署流程文件,获取流
程文件,查询流程定义信息等操作,是引擎中的一个重要的服务。
获得方法:
RepositoryService repositoryService
=engine.getRepositoryService();
部署流程:
@Test
public void deployAddSigninProcess(){
//获得配置对象
ProcessEngineConfiguration config=
ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
//创建核心引擎
ProcessEngine processEngine=config.buildProcessEngine();
//获得仓库服务
repositoryService=processEngine.getRepositoryService();
//部署流程,支持链式编程
repositoryService
.createDeployment()//创建部署对象
.key("addsigninProcess")//设置部署流程键值
.addClasspathResource("bpmn/proc_addsignin.bpmn")//添加bpmn文件
.addClasspathResource("bpmn/proc_addsignin.png")//添加png文件
.name("补签流程")//设置流程名称
.deploy();//部署
}
执行完上面的代码后会向下面三张表中插入记录:
act_re_deployment存放流程定义的显示名和部署时间,每部署一次增加一条记录
act_re_procdef存放流程定义的属性信息,部署流程定义都会在这张表中增加一条记录。
act_ge_bytearray存储流程定义相关的部署信息。
即流程定义文档的存放地。
这样一个补签的流程就完成了部署,后面我们可以按照部署的流程进行层层审批直到完成整个流程。