activiti流程开发基本步骤详解_第1页
activiti流程开发基本步骤详解_第2页
activiti流程开发基本步骤详解_第3页
activiti流程开发基本步骤详解_第4页
activiti流程开发基本步骤详解_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

activiti流程开发指南一、BPMN二、activiti主要接口三、如何实现一个业务流程四、如何管理所有流程与实例五、开发流程一、BPMN.什么是BPMN首先BPMN规范是由标准组织BPMI发布的.BPMN1.0规范发布于2004年5月。此规范展示了BPMI组织两年多的努力成果。BPMN的主要目标就是要提供被所有业务用户理解的一套标记语言,包括业务分析者、软件开发者以及业务管理者与监察者。BPMN还将支持生成可执行的BPEL4WS语言。所以,BPMN在业务流程设计与流程实现之间搭建了一条标准化的桥梁。BPMN定义了业务流程图,其基于流程图技术,同时为创建业务流程操作的图形化模型进行了裁减。业务流程的模型就是图形化对象的网图,包括活动(也可以说工作)和定义操作顺序的流控制。.BPMN基础业务流程图由一系列的图形化元素组成。这些元素简化了模型的开发,且业务分析者看上去非常熟悉。这些元素每个都有各自的特性,且与大多数的建模器类似。比如,活动是矩形,条件是菱形。应该强调的是:开发BPMN的动力就是为了在创建业务流程模型时提供一个简单的机制,同时又能够处理来自业务流程的复杂性。要处理这两个矛盾的需求的方法就是将标记的图形化方面组织分类为特定的类别。这里提供标记类别中的一小部分,以便业务流程图的读者可以简单地识别出元素的基本类型从而理解图形。以下是四种基本的类型:1)流对象2)连接对象3)泳道4)人工信息BPMN2.0概要:/workclass/201206272.aspactiviti主要接口PmcessEngineConfiguration activiti.dg.xmIRepo&rtaryService*TaskService■IdentityService■FormServrceRuntimeService■ManagementService■HistaryServiceProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();RuntimeServiceruntimeService=processEngine.getRuntimeService();RepositoryServicerepositoryService=processEngine.getRepositoryService();TaskServicetaskService=processEngine.getTaskService();ManagementServicemanagementService=processEngine.getManagementService();IdentityServiceidentityService=processEngine.getIdentityService();HistoryServicehistoryService=processEngine.getHistoryService();FormServiceformService=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引擎时最先接触的服务。它提供了管理和控制发布包和流程定义的操作。这里不涉及太多细节,流程定义是BPMN2.0流程的java实现。它包含了一个流程每个环节的结构和行为。发布包是Activiti引擎的打包单位。一个发布包可以包含多个BPMN2.0xml文件和其他资源。开发者可以自由选择把任意资源包含到发布包中。既可以把一个单独的BPMN2.0xml文件放到发布包里,也可以把整个流程和相关资源都放在一起。(比如,'hr-processes'实例可以包含hr流程相关的任何资源)。可以通过RepositoryService来部署这种发布包。发布一个发布包,意味着把它上传到引擎中,所有流程都会在保存进数据库之前分析解析好。从这点来说,系统知道这个发布包的存在,发布包中包含的流程就已经可以启动了。除此之外,服务可以■o查询引擎中的发布包和流程定义。o暂停或激活发布包,对应全部和特定流程定义。暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。o获得多种资源,像是包含在发布包里的文件,或引擎自动生成的流程图。o获得流程定义的pojo版本,可以用来通过java解析流程,而不必通过xml。正如RepositoryService负责静态信息(比如,不会改变的数据,至少是不怎么改变的),Runtimeservice正好是完全相反的。它负责启动一个流程定义的新实例。如上所述,流程定义定义了流程各个节点的结构和行为。流程实例就是这样一个流程定义的实例。对每个流程定义来说,同一时间会有很多实例在执行。RuntimeService也可以用来获取和保存流程变量。这些数据是特定于某个流程实例的,并会被很多流程中的节点使用(比如,一个排他网关常常使用流程变量来决定选择哪条路径继续流程)。Runtimeservice也能查询流程实例和执行。执行对应BPMN2.0中的'token'。基本上执行指向流程实例当前在哪里。最后,RuntimeService可以在流程实例等待外部触发时使用,这时可以用来继续流程实例。流程实例可以有很多暂停状态,而服务提供了多种方法来‘触发'实例,接受外部触发后,流程实例就会继续向下执行。任务是由系统中真实人员执行的,它是Activiti这类BPMN引擎的核心功能之一。所有与任务有关的功能都包含在TaskService中:■o创建独立运行任务组这些任务与流程实例无关。o手工设置任务的执行者,或者这些用户通过何种方式与任务关联。o认领并完成一个任务。认领意味着一个人期望成为任务的执行者,即这个用户会完成这个任务。完成意味着“做这个任务要求的事情”。通常来说会有很多种处理形式。Identityservice非常简单。它可以管理(创建,更新,删除,查询...)群组和用户。请注意,Activiti执行时并没有对用户进行检查。例如,任务可以分配给任何人,但是引擎不会校验系统中是否存在这个用户。这是Activiti引擎也可以使用外部服务,比如ldap,活动目录,等等。FormService是一个可选服务。即使不使用它,Activiti也可以完美运行,不会损失任何功能。这个服务提供了启动表单和任务表单两个概念。启动表单会在流程实例启动之前展示给用户,任务表单会在用户完成任务时展示。Activiti支持在BPMN2.0流程定义中设置这些表单。这个服务以一种简单的方式将数据暴露出来。再次重申,它时可选的,表单也不一定要嵌入到流程定义中。HistoryService提供了Activiti引擎收集的所有历史数据。在执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者,完成任务的时间,每个流程实例的执行路径,等等。这个服务主要通过查询功能来获得这些数据。Managementservice在使用Activiti的定制环境中基本上不会用到。它可以查询数据库的表和表的元数据。另外,它提供了查询和管理异步操作的功能。Activiti的异步操作用途很多,比如定时器,异步操作,延迟暂停、激活,等等。三、如何实现一个业务流程1.静态表单(每个节点绘制对应的表单)o创建工作流实例(process_model)StaskListljspjjfview-formljsp一般以list页面弹出一个form表单页面就可以,至于表单的字段隐藏或者展示,由表单自己控制。o部署流程把process_model导出为BPMN.XML格式,再导入进行流程部署1、^/2uviu・FJiTi1TW 首页X模型工作区过程中列表ProcessInstanceQueryquery=runtimeService.createProcessInstanceQuery().processDefinitionKey("process").active().orderByProcessInstanceId().desc();流程定义及部若管理M提示:点击xm或者png^可以查看具《0'部罟流程ProcessDefinitionld Deploymentld名称leave-formkey:2:2OO23 20001 清粉鹿况单 leave-formkey 2 Ieave-formkev.bpmn20.xml leave-formkeYDna :2617.31.57CST false|2016 荏 Modelleave-jpa:1:20024 20001 熊"-JPA leave-jpa 1 leave-iDabomn leave-iDapna FnFeb2617:31:57CST 胃se|挂 祥触2016 起 Model 一-一 . .. . FriFeb2617:31:57CSTfalser删除侬为•开始流程保存业务实体leaveManager.saveLeave(entity);开始业务流程//用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中identityService.setAuthenticatedUserId(entity.getUserId());//process为流程keyprocessinstance=runtimeService.startProcessInstanceByKey("process",businessKey,variables);•办理流程taskSplete(taskId,variables);其中variables是可以传递在流程间的变量,通过Map<String,Object〉variables=taskService.getVariables(taskld)可以获取那些变量。•待办列表TaskQuerytaskQuery=taskService.createTaskQuery().taskCandidateOrAssigned(userId);//自己办理或在该节点对应工作组中的流程List<ProcessInstance>list=query.listPage(pageParams[0],pageParams[1]);已结束列表HistoricProcessInstanceQueryquery=historyService.createHistoricProcessInstanceQuery().processDefinitionKey("process").finished().orderByProcessInstanceEndTime().desc();List<HistoricProcessInstance>list=query.listPage(pageParams[0],pageParams[1]);如何管理所有流程与实例查看所有已部署的流程repositoryService.createProcessDefinitionQuery().active().orderByDeploymentId().desc();查看所有待办tasks=taskService.createTaskQuery().active().orderByTaskId().desc().list();个人待办tasks=taskService.createTaskQuery().taskCandidateOrAssigned(user.getId()).active().orderByTaskId().desc().list();查看所有办理中ProcessInstanceQuerydynamicQuery=runtimeService.createProcessInstanceQuery().orderByProcessInstanceId().desc().active();办理中(本人)ProcessInstanceQuerydynamicQuery=runtimeService.createProcessInstanceQuery().involvedUser(UserUtil.getUserFromSession(session).getId()).orderByProcessInstanceId().desc().active();

•查看所有已办HistoricProcessInstanceQuerydynamicQuery=historyService.createHistoricProcessInstanceQuery().finished().orderByProcessInstanceEndTime().desc();已办(本人)HistoricProcessInstanceQuerydynamicQuery=historyService.createHistoricProcessInstanceQuery().involvedUser(UserUtil.getUserFromSession(session).getId()).finished().orderByProcessInstanceEndTime().desc();五、开发流程.绘制流程图单节点,多用户流程:必须设置下图红框属性,Multi-instancetype代表是单用户还是多用户Miriti-instancetypeCollection(Multi-instance)Completioncondition(Multi-ParallelNoreParallelSequentialCollection(Multi-instance),单节点,多用户流程:必须设置下图红框属性,Multi-instancetype代表是单用户还是多用户Miriti-instancetypeCollection(Multi-instance)Completioncondition(Multi-ParallelNoreParallelSequentialCollection(Multi-instance),代表是用户的集合名称,需要在代码中设置Elementvariable(Multi-instance),集合中的属性,不需要设置。Id:step2Name:Documentation:NovalueAsynchronous:0Exclusive:Executionlisteners:NoexecutionlistenersconfiguredMuttn-instancetype:ParallelCardinality(MuHi-instance):NovalueCollection(Multi-instance):Ehmentvariable(Multi-instance):1gH|Completioncondition(Multi-instance):NovalueIsforcompensation:Assignments: L-• 包容网关•并行网关,不管是否设置条件,都会并行执行• 包容网关•并行网关,不管是否设置条件,都会并行执行,根据条件可以执行单个或多个分支。注意点:1.绘制流程的时候,箭头保证一定要已连接到usertask.保证网关使用的时候,条件要写明Flowcondition:.保证流程绘制的简单化,重复节点最好保证使用同一个usertask,减少jsp代码的编写量。2.表单编写勇展天事5月勇展天事5月主臂比出筮时何塞叵才同AgEntityAgTable(name=”千打巾_与飒购片)publicclass5已nd匚3rextendsModel!privateStringphone;privateStringy^cNote;回匚口11|[1门(匚0111小门[>已于:1门:11:10门=Irdate")privateDateycBeginTime;@匚口111(1口(匚oluminDBfinition=''date")privateDateycEndTime;回匚口11|[1口(匚。[11小门[>已于:1门:11:10门=''numberIr)privateprivateprivateprivateprivateprivateprivateintycNum;String

String

String

StringprivateprivateprivateprivateprivateprivateprivateintycNum;String

String

String

StringString

Stringmdd;ksSuggestion;IdSuggestion;carNo;driver;driverPhone;四匚cilunin(匚办lunnDEfinition=IrdateirJprivateDatebeginTime;©匚口11|[11门(匚。[11日门[>曰于:1门:11::10门=Irdateir)privateDateendTime;回匚oluninlcolumnDefinition='"number")privateFloatbeginLcs;回匚口11|[11门(匚。[11日门(>已于:1门:11::10门=''numberIr)privateFloatendLcs;entity继承model类,model类中存在一个公共的业务实体commmodel,用来存储表单共用的的属性。4.编写后台controllerPIgtontrollerAgRequEEtMapping(value="/标标祁”)publicclasssendcarcontrd1erextendsModelcontr-ol1er<s&ndcar>{privateLoggerIloggB产=LDgg&r-FactDry-getLogger[getclass[))jgPostconstructFlpri^'aievoidinitMod&l(){S';if(thie.model==nu1L){model=ne..15&nd€ar[)jmDdelClasE=(ClaEE<SendCar->)model・getClass()j)^_^}caich(Exceptions)(logger.error["initModelfail^Jj)41L■自动流程*/gRequestMapping(value="start"jmethod=RequestMethod.PO5T)^ResponseBodypublicStringstartWorkflow(StringformDataStringjHttpSessionisessionjStringkeyjVariable-f-y<model=FastDsonUtils.parseQbj&ct(fortnDataStringjmodsl€lass)jMap<StringjObjEct>variables=var.getVariablE«ap()jif[SstringUtils.isEmpty(users)){String[]|split=StringUtils.split[users57/variables.put(userKeyjArrays.asList(split))j)■■■Useruser=JserLfti1.getUserFromSession[seesion)jmode1・gEt€Dfflm^.odel()■setUserid(user.getId[));Stringse-q=mDdeiManager.queryMd("S_cbr_SEQr,).tostring[);/Stringno="PC"-se-qjmodel・getCDHiH^todel[)■SEtMofno)jstartWorkflowfkev.variables\:•controller继承modelcontroller,modelcontroller存在待办,已办,办理的查询列表,完成以及开始功能也存在,只是由于开始和完成可能存在不同的业务需求,所以还是写在自己的controller中。startWorkflow开始流程complete完成任务taskList待办列表runningList办理列表finishedList已办列表<script>'--2r颉海4="$;叩「切・标国或,jarprocEEELnEianceZd="Stparam.prsceEEZnEianceZd}"j加发="5{param.XU^)"jmini.laycutQjmini.parse(1:,--ardEtailUrL=飞己iA"'-procEEELni-zsnceEd5'--2rsaveurl="${c-z:<}/5^i4^:/cDTiplete/"-,-■arquEryPEPEcnUrl="打匚:口/最灿湫:/取蜘如勘扇躯飞,jarjurnpUrl="${ci:<}/p2ges/tasks/taskList.jsp"if(!leEmpty(prcceeeLnetanceId)){LaadCketaiL(}eLse(S["#procesE").hidE(■ini.get(~depid").netVa1ue("$<'emp.depart»ent^|iji}");■ini.get("depNaae").setValue("${e«p.depa1nt・en七.depa1nt・entNm・e}")}■ini.get["usBrNaoie").setVa1ue("${eap.eaployeeHaae)-;■ini.getfuserid").setVaLue("${«p. setStep()设置每一步的可编辑与不可编辑• complete。完成任务,调用comm.js setStep()设置每一步的可编辑与不可编辑• complete。完成任务,调用comm.js中的completeForm(users,userKey,key,tkey,ta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论