工作流引擎讲解

上传人:d****1 文档编号:179580599 上传时间:2023-01-02 格式:DOCX 页数:11 大小:382.58KB
收藏 版权申诉 举报 下载
工作流引擎讲解_第1页
第1页 / 共11页
工作流引擎讲解_第2页
第2页 / 共11页
工作流引擎讲解_第3页
第3页 / 共11页
资源描述:

《工作流引擎讲解》由会员分享,可在线阅读,更多相关《工作流引擎讲解(11页珍藏版)》请在装配图网上搜索。

1、什么是工作流引擎,工作流引擎有什么作用,为什么需要工作流管理系统,在这里我们主要研究它的好处,你想要理解它的好处,就得知道不使用它会带来什么样的坏处。 现在我们来讲工作流,什么是工作流?所谓的工作流就是通常所说的业务流程,那么所谓的业务流程 换句话来讲就是多个人在一起去完成一件事情。这就可以称之为工作流。流程的本质就是一个参与者参与 到一个过程里面来那么现在我们就想为什么需要工作流管理系统,工作流管理系统能给我们带来什么好处。我们就从这 个角度出发来了解 JBPM 工作流引擎下面我们就来看关于为什么需要工作流管理系统,以及它给我们带来的好处。实际上它带来的好处就是使某些容易变化的东西抽象出去,

2、我们能够通过某种方式改变它,然后你就可以 对你的某些核心部分不需要做什么变动现在就通过一个小例子来讲这个工作流引擎到底是一个什么东西举个请假流程的例子一个请假的过程重点讲解UML里面的内容,确定UML里面流程图的讲解顺序请假流程 现在只看左边的内容,右边的后面再讲,我是方便讲解就将这点东西放到这个空白的地方张三审核李四审核工作流管理系统的构成1、工作流引擎(这个是核心,后面的是一些常用功能)2、工作流设计器(设计流程(ROSE)、定义流程我们 是使用它,而不是自己做一个)3、流程操作(流程引擎提供的一些API我们去调它。比如 启动、结束、挂起、查询流程)4、工作流客户段程序(用工作流的那些客户

3、端。比如将 jpbm集成到某个系统,那个系统对工作流引擎来说就是客 户端程序)5、流程监控(对流程流转进行监控)6、表单设计器(表单的设计)7、与表单的集成8、与应用程序的集成一个简单的流程图Main模拟出请假的过程王五审核张三李四王五对提交请假单进行分析用一个用户来表示普通用户和审批者,只不过他们的权限不同,他们都能够登录到这个系统现在我们来看用户和请假单,分析他们之间的关系,用户和请假单之间的联系有请假,用户填了一个 请假单就创建了一个请假单对象,他们之该是一对多的关系。因为某一个用户可以请多次假对吧(其实一 般是一个请假单对应一个请假者,这个需求就应该得到客户的确定,客户说了算)那么用户

4、和这个请假单 之间还有没有其他联系?接下来是提交请假单。我首先将请假单提交给张三,那么张三就能够看到这个请假单,如果用户将请 假单提交给张三,那么就可以在张三和请假单之间建立一个待审关系 他们之间的关系也是一对多的关系, 因为张三可以同时审核几个请假单,就是这意思,一个请假单等待的用户是一个,从现在的需求来看。那 么两者之间还有另外一个联系那就是已审,一个用户可以审批过多个请假单,请假单也可以被多个用户审 批比如张三审批以后交给李四审批,李四审批以后交给王五审批,其实这个已审就是记录审批信息的,比 如审批时间,审批意见,把它放在审批关联里边这个就是一个基本的概念,了解这个概念之后我们就考虑它的

5、设计,JBPM实际上就是协助我们把这 个请假单从一个用户手上转递到另一个用户手上。当把这个模型分析清楚了我们就要去实现它。这里重点分析提交,怎样去提交,在SSH架构体下,提交请假单这个业务逻辑,你可能就需要这样一 个业务逻辑类,里边可能有这么一个方法专门来进行提交操作的,那么这个方法怎样设计,以及这个方法 怎样去实现。了解这点你就可以了解JBPM干什么的,能给我们带来什么好处(用自己的话说明一下提交请假单的过程 读一下那段伪代码)提交请假单(请假单ID,提交者ID) 区if请假单是新建的then设置请假单的审批者是张三if提交者是张三and请假单已审批通过then设置请假单是审批者是李四在这个

6、过程里边写这些代码是比较麻烦的,现在还只是一个固定的流程,假设我现在在这里边变化一下 那 么整个方案都要变动。 我现在希望有一个会签的功能 比如我现在要将这个这样的功能,把这个请假单 同时提交给多个审批者审批。那这个时候你就不能够在请假单中间增加一个外键,把它整成审批者什么的, 这个时候你就要新建一张表,在那个表里面记录这个请假单和审批者之间的关联,提交请假单实际上就是 维护这个审批者与待审之间的关联假设我现在要新加一个审批者,或者要减少一个审批者,那么就要修改代码这就很麻烦。所以假设 一开始客户就告诉你这个期间可能会有人员的变动。那这个时候我们就应该怎么办?有什么样的思路? 我们是不是就应该

7、对这一些变化进行一个小小的封装?怎样去封装或者怎样来封装呢?我们以前是不是经 常把那些数据库里面的用户名,密码什么的放在一个配置文件里面 因为它可能经常发生变化。所以这里 我们也是将他们整合到一个配置文件里面当你在思考如何来创建这么一个文件 给它指定某种规则来描述这个流程 然后再写一段代码来解释这个规则 然后根据这个规则来调度这个流转 这件事情的时候你就是在设计一个工作流引擎提交请假单怎样提交,工作流引擎就是做这种事情的工作流引擎做两件事情1、给你提供某种规范来定义规则,如何定义一个流程的这种规范。你可以根据它提供的相关概念来定 义更为复杂的流程。这就是工作流引擎做的第一件事情叫做定义流程2、

8、工作流引擎还得解释这个规则,还要负责流转这个过程就叫执行流程JBPM的核心就是定义流程和执行流程总的来说(这是一段总结性的语言,稍微有点官方)工作流引擎为我们提供相关概念的定义,给我们提供了相关API调用这个引擎去执行流程如果我们不用这个工作流引擎,那么我们的代码就会非常的复杂,而且维护起来非常困难流程的操作实际上就是工作流弓摩提供相关的API我们去调用它接下来我们就来看 工作流管理系统的构成(在UML的请假流程里面)工作流引擎(这个是核心,后面的是一些常用功能)工作流设计器(设计流程(ROSE )定义流程我们是使用它,而不是自己做一个)流程操作(流程引擎提供的一些API我们去调它。比如启动、

9、结束、挂起、查询流程)工作流客户段程序(用工作流的那些客户端。比如将jpbm集成到某个系统,那个系统对工作流引擎来说就是客户端程序)流程监控(对流程流转进行监控)表单设计器(表单的设计)与表单的集成与应用程序的集成参考模型一WFMC核心调度算法1、FMS2、PetriNet(令牌,JBPM就是通过令牌来调度的,意思就是你的请假单从张三提交到李四的时候, 它就是通过令牌知道的,令牌就从张三指向李四。我觉得应该是令牌先指向李四的,或者说是同时进行 的)接下来讲解 JBPM 架构,我这个图是在网上找的只不过添加了一些中文注释,因为考虑到大部分人英语还是没有过六级的,但是过了六级也不一定知道的,jBP

10、M架构Administrator9理警警种jBPIW的组成iS ENGINE:QJT-.-流程定义的基本概念JUPKRitf去时是适 倉出来的就址按口PROCESS DEFiNTICWPROCESS MONITORPPUCfei, ATmojiES$VIT忙总管圧LKTCM ZTE岡心QK 5ERVCE5逼熬定配ia言jimjPflJOCKGIMWN3ELOG WWGEflFUK园Systemsai我馳应用慕览的!DTFXTjaffvcesAjrukihlJ J(liServke 肖赳 IW%裁与fF这亍就理烘电 索的用户.张二,卞UsersProcess DeveloperjBPMPROCE

11、 DEFM7IW loaqbLSEM.IVL匕ArrfiiajSE!D&rirllWlig紀J:JBoss jBPMExcCutiOiniJ Srvk*rrsenCf*Mjb刊的冥启土从请假流程图里面可以看出一个流程是多个点和线构成,看图上的箭头是实心的。点和线之间的关系 是什么样的关系?一个点就是一个node对象,一个线就是一个transition对象。第一根线(连接开始和 张三审批)第二跟线(连接张三审批和李四审批),他们的起点和终点不同,而且他们都有方向。线就是描 述从一个节点到另一个节点。也就是from.to.!Node这个节点就是普通节点它没什么行为,它的行为需要你自己来定义(接下来

12、按顺序解释 图片上的内容(讲到fork join的时候要画一个带有同步杆的图)讲到任务节点的时候提问什么是任务? 任务就是某件事情需要由某些人去做?就像我现在向你们提问,这就是一个任务V : Rric-王五end接下来讲解流程执行的概念|口 D Pz+uliwhMER 口 口 s d D 叶51*|“口 口 rm a 0DD4 ill ODO D D 0 Dd皿t忖 annoanD 口口口口口口口口口口 口口口口 d口vt“Fl KUJ U*|KI灵irtiK即卅 F|j旳田凶to!:决:QQDaaCiDiQGi QDEia aailiQ 口JBPM流程引擎核心调度过程(要把这部分讲清楚) 调

13、用 Processinstace()方法首先客户端调用processinstance里面的signal方法,然后判断流程实例是否结束,然后调用这个token 的signal方法,这个token的signal方法肯定是跟一个节点相关的那么它是怎样找到这个节点的,实际 上这个Node里面有一个leave方法,这个是节点里面的一个方法。但是从一个节点出发可以有多个离开 的线,那它是怎样选择离开的线的?实际上在流程实例里面还有一个signal方法,这个signal方法是带参 数的,里面有一个名称。所以在第1步调signal方法的时候你指定了名称,那么执行到第4步的时候他就 会通过这个名称来找到那根离开

14、的线,如果一开始没有指定名称,那么它就随机的找到一根离开的线,意 思就是随机的找到一根线离开,所以它在第5步有一个任务就是找到要离开的transition。然后它离开到 下一个节点也是通过名字找到transition,调用transition里面的take方法,然后就找到下一个节点,调 用里面的enter方法。然后到了这个节点内部他会把token指向的节点改为自身。这样token的引用就从 from节点到了这个to节点。然后在这个节点里边还要执行一个excute方法,这是它内部的一个方法, 这个方法就是这个节点行为的体现。因为不同的节点有不同的行为。彳接下来在myeclipse上看看JBPM到

15、底是一个什么东西,不用你们敲代码我来演示给你们看设计器里面的内容(前面的这些我们已经了解过了,开始,结束什么的)这里面就只有processState和superStage在前面没有讲解过process state用来连接一个子流程,因为jbpm支持把两个节点连接起来,就是到一个节点以后启 动一个新流程然后这个流程执行完了以后又回到这个节点Superstate讲的是这样一个过程假如你现在有个非常复杂的流程,有几十个步骤,那么你就可以用 superstate 将其中一些步骤组织起来,形成一个阶段一个阶段的接下来看source里面的内容xmlns= um:jbpm.org:jpdl-3.2这个文件在

16、我们流程设计的时候会有一些自动的流程代码提示,去掉 也没关系name 流程定义的名字 比如请假单 报销单等Action相当于你要定义一个类去处理某种事情,那么把Action写到transition内部,那么它处理的就是 transition事件,这个事件在调用take方法的时候发生,在take里面只能抛出transition事件类型如果把一个 Action 直接放到一个 state 内部,就是放到节点内部。实际上它是不清楚的,不清楚究 竟在什么时候调用它,如果 你要定义在这个节点内部你要在它的外部加上一个 event type=node-enter就是指在 node-enter 的时候调接下来

17、就来看 Action 里面的内容name名称这个东西不重要重要的是后面的class,它就是一个类,jbpm在从第一个节点转向到第二个 节点,就是这里的起点转向到first节点这个过程里边会触发类里面的某个方法被调用,就是这个意思,这 个类在 MessageActionHandler.java 里面。 (然后将页面转向到此处)在JBPM里边action都要实现actionhandler接口( handle :处理器处理机的意思)ActionHandle里面对应的这个方法叫做excute方法 (excute :处决)这个excute方法是jbpm主动 调用的,当事件发生的时候这个方法就自动被调用

18、然后这个里边有个Executioncontext,这个就是执行 上下文,实际上就是执行环境,可以把它理解为一个大杂脍,如果我想在这里边对数据库进行操作的话, 你可以从这里边拿到hibernatesession,也可以拿到流程实例,流程容器等Action就讲到这里,然后这里边又嵌套了一个message这个message的作用就是将里面的内容自动注入到StringMessage里面去 这个值在什么情况下有用呢? 在流程定义的时候你希望有某些值可以灵活的指定,而不是死写在代码里边,比如某些配置信息什么 的。你也可以把message这个标签换成其他的名字,比如将它改为message。jbpm流程的定义

19、非常的 灵活,我们可以自由定义标签(所以在这里我们看不到dtd)以上就是流程的定义,接下来讲解流程的执行,前面已经将流程定义好了,在这里可以看到ProcessDefinition流程定义这个类,这个类里边有一些静态方法ParceXMLResurce,他就把流程定义文 件读进来了,通过指定路径来读的,编译之后这些文件都是在一个目录里边,所以能读取,读进来就变成 个 processDifinition对象,这个就是解析这个XML文件AssertNotNULL,断言它非空,解释完如果正确的话就不是空的。接下来我们创建一个流程定义对象,根 据流程定义对象创建流程实例,如何来创建一个根据某种规则来进行流

20、转的流程实例呢?就是这样创建 newProcessinstance ( processdefinition ) 一定要记得给他传递一个流程定义对象,否则流程实例无法 流转。实际上那个这个processinstance.XML文件在解释完之后就没用了。因为我们可以把这个流程定义 对象存到数据库里边,从数据库里边把这个流程定义对象拿出来,然后再创建流程实例。然后是断言 equals,也就是这个值(instance.getRootToken().getNode().getName()和这个值 start是相等的。前面一句话,我们来看UML流程定义执行概念里面的左下框的第一句话:在创建 流程实例的同时

21、,JBPM会创建一个跟流程实例对应的Token ( RootToken )对象,这个对象一开始指向 起点,这个起点称为Start然后看下面,instance.getContextInstance().getVariable(message)。Contextinstance 就是前面 的流程实例变量容器,这个message变量现在还是空的,因为transition事件还没有发生。接下来触发流程实例往下流装,instance.signal(),触发流程往下流转,这个signal方法就会触发一系列 的过程,也就是之前讲的核心调度过程,在take的时候就会抛出transition事件 到这个时候Mes

22、sageActionHandler.java这个类自动被调用,这个类里面的excute()方法就被调用了 在这个里面 context.getContextInstance(),当前实例对应的 contextinstance 要 setVariable,就是把上 面的message信息放到message变量里面去。所以signal之后就有这样两种结果,首先这个流程实例对应的 RootToken 节点已经指向了 first 节点, 然后,这个流程实例变量里边 contextinstance 变量里面的 message 就是下面这个值,” Goingtothefirststate ”,这个值就是我们

23、 在流程定义里面定义的,这个值先放到流程定义的message里边,然后从MessageActionHandler.java 里面放进去,从 SimpleProcessTest.java 这边拿,就是这个意思 那出来之后再触发signal方法,这时候流程节点的名称已经变成了 end , message的值也变了这整个过程就演示了一件事情,流程实例变量里边的值是可以改变的,也就是message变量是可以 改变的。这就是我们的第一个例子,这里边就介绍了 jbpm里边一些基本的API,以及我们前面讲的这些 概念的验证,运行一下发现是个绿条,这说明这里面所有的一些运行都符合我们的预期,就这样 接下来我们

24、来了解公文流转的基本过程l. -审批公文部署流程,即把流程定义对象持久 化到数据库中*引入MySQL驱动*修改 hibernate.cf g.xml,以便使用 MySQL 数据库*创建jbpm所用的数据库表*根据流程定义文件,解释得到流程 定义对象,把流程定义持久化.查询待审核 公文列表继续提交公-文创建公文对象 创建流程实例对象1、 从数据库中加载ProcessDefinition对象2、ProcessDefinition对象,创建流程实例对象 把公文对象和流程实例对象互相绑定定义流程m流程定义 文件-部署流程11.丨提交公文将公文提交到下一个环节1创建公文第一个JBPM流转的的实例建好工程

25、,打开设计器,设计好后看节点,在节电里边定义任务这里面的意思就是这里有个审批任务,这个任务由张三来完成一个节点里面可以定义多个task1、首先是创建数据库表JbpmOICreateTablepublicclassJbpmO1CreateTableextendsTestCase publicvoidtestCreateTable()用JbpmConfiguration创建数据库表,getInstance()就通过类路径去读取配置文件 调用这个createSchem()就能够将这些数据库表创建出来 JbpmConfiguration.getInstance().createSchema();2、

26、部署流程定义Jbpm02DeployProcessDefinitionstaticJbpmConfiguration jbpmConfiguratio=JbpmConfiguration. getInstance();部署流程定义,根据流程定义文件,解释得到的流程定义文件,把流程定义持久化到数据库public voidtestDeployProcessDefinition()ProcessDefinitiondef=ProcessDefinition .parseXmlResource(firstJbpm/processdefinition.xml);JbpmContextcontext= j

27、bpmConfiguratio.createJbpmContext();/jbpmContext 是对 hibernatesession 的封装,提供了对 JBPM 相关对象的持久化try context.deployProcessDefinition(def); catch (Exception e) context.setRollbackOnly(); finallycontext.close();首先读取这个文件,然后怎样把它持久化到数据库里面去? 凡是涉及到 JBPM 这些对象的持久化,都要拿 到jbpmcontext 这就是入口。Hibernate 里面拿到 session 是通过s

28、essionFactory ,通过读取 Hibernate 的配置信息拿到sessionFactory ,通过sessionFactory得到session ,通过session对对象进行持久化 在 jbpm 里面通过 jbpmConfiguration 得到 jbpmcontext 对象 通常 jbpmConfiguration 在一个系统 里边只有一个。所以把它定义成静态的 然后创建一个context对象在最后要将context关闭这个会导致我们的事物进行提交或回滚然后把session关闭 如果不关闭则在 数据库里边看不到相关的记录数据库里边的一些表是放那个图里边的一些相关的数据的 我们先

29、看些常用的,看里面有什么东西 为什么先看些常用的,因为我现在只知道这些常用的3、创建公文 Jbpm03CreateDocumentpublic voidtestCreateDocument()/JbpmContext是对hibernatesession的封装,提供了对JBPM相关对象的持久化JbpmContextcontext= jbpmConfiguratio.createJbpmContext();qtry/创建公文对象,创建一个公文实体类DocumentDocumentdoc= newDocument();doc.setTitle(测试公文+ newRandom().nextInt(99

30、99);context.getSession().save(doc);/创建流程实例对象1、从数据库中加载ProcessDefinition对象ProcessDefinitiondef=context.getGraphSession().findLatestProcessDefinition( firstJbpm);/2、根据ProcessDefinition对象,创建流程实例对象ProcessInstanceinstance= newProcessInstance(def); context.save(instance);3、把公文对象和流程实例对象互相绑定 doc.setProcessIn

31、stanceld(instance.getldO); instance.getContextInstance().setVariable(documentId,doc.getId(); catch(Exceptione)e.printStackTrace();context.setRollbackOnly(); finallycontext.close();4、提交公文 Jbpm04SubmitDocument将公文提交到第一个环节public voidtestSubmitDocument()/JbpmContext是对hibernatesession的封装,提供了对JBPM相关对象的持久化J

32、bpmContextcontext= jbpmConfiguratio.createJbpmContext();try /已知公文intdocumentId=4;Documentdoc=(Document)context.getSession().load(Document. class,documentId); /得到公文对应的流程实例对象 longprocessInstanceId=doc.getProcessInstanceId();ProcessInstanceinstance=context.getProcessInstance(processInstanceId); /将公文提交到

33、下一个环节instance.signal();对于一个公文来讲只能执行一遍 catch(Exceptione)e.printStackTrace();context.setRollbackOnly(); finallycontext.close();5、公文当前所处的环节Jbpm05CurrentNodeSystem.err.println(公文【+doc.getTitle() + 】当前所处的环节是: + instance.getRootToken().getNode().getName()+*instance 是否已经结束?+instance.hasEnded(); 将公文提交到下一个环节

34、,对于一个公文来讲只能执行一遍6、如何得知在某个用户手上有哪些公文 Jbpm06SearchMyTaskListpublic voidtestSearchMyTaskList()/JbpmContext是对hibernatesession的封装,提供了对JBPM相关对象的持久化 JbpmContextcontext= jbpmConfiguratio.createJbpmContext();try 已知用户printTask(context,张三”);printTask(context,李四”);printTask(context,王五”); catch(Exceptione)e.printS

35、tackTrace();context.setRollbackOnly(); finallycontext.close();private voidprintTask(JbpmContextcontext,StringactorId) Lisitasks=context.getTaskMgmtSession().findTaskInstances(actorId);for(Iteratoriter=tasks.iterator();iter.hasNext();)TaskInstanceti = (TaskInstance)iter.next();IntegerdocId =(Integer)

36、ti.getProcessInstance().getContextInstance().getVariable(documentId); Documentdoc=(Document)context.getSession().load(Document. class,docId);System.err.println(流转到【+actorld + 】手上的公文是:+doc.getTitle();7、将公文提交到下一个节点Jbpm07NextNodepublicvoidtestNextNode()/JbpmContext是对hibernatesession的封装,提供了对JBPM相关对象的持久化

37、 JbpmContextcontext=jbpmConfiguration.createJbpmContext();try/已知用户和它要提交的公文intdocumentld=4;NextNode(context,张三,documentId);/NextNode(context,李四,documentld);/NextNode(context,王五,documentld);catch(Exceptione)e.printStackTrace(); context.setRollbackOnly();finallycontext.close();privatevoidNextNode(JbpmC

38、ontextcontext,StringactorId,intdocumentId) Listtasks=context.getTaskMgmtSession().findTaskInstances(actorId);for(Iteratoriter=tasks.iterator();iter.hasNext();)TaskInstanceti=(TaskInstance)iter.next();IntegerdocId=(Integer)ti.getProcessInstance()去-擦煤K-件祿汹迪舉、出职莘【= + PIoe+=】題皿+(oRE&:op+ = 】仪UURUUdepuJESAS-(PPOP、ssep.luQlunoocl)peo-ouo 一 ssQslQ6.1xQluooQUQlunooclToopluQlunooclSPUWQSKW1H 坦代()一eu6u_s si u01g屁汕映譴 lo6. ()00 UBS u IlxQlu oyo6

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!