ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:281.40KB ,
资源ID:6261892      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/6261892.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(工作流引擎讲解.docx)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

工作流引擎讲解.docx

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

2、的东西抽象出去,我们能够通过某种方式改变它,然后你就可以对你的某些核心部分不需要做什么变动 现在就通过一个小例子来讲这个工作流引擎到底是一个什么东西 举个请假流程的例子 一个请假的过程 重点讲解UML里面的内容,确定UML里面流程图的讲解顺序 请假流程 现在只看左边的内容,右边的后面再讲,我是方便讲解就将这点东西放到这个空白的地方 一个简单的流程图Main模拟出请假的过程 对提交请假单进行分析 用一个用户来表示普通用户和审批者,只不过他们的权限不同,他们都能够登录到这个系统 现在我们来看用户和请假单,分析他们之间的关系,用户和请假单之间的联系有请

3、假,用户填了一个请假单就创建了一个请假单对象,他们之该是一对多的关系。因为某一个用户可以请多次假 对吧(其实一般是一个请假单对应一个请假者,这个需求就应该得到客户的确定,客户说了算)那么用户和这个请假单之间还有没有其他联系? 接下来是提交请假单。我首先将请假单提交给张三,那么张三就能够看到这个请假单,如果用户将请假单提交给张三,那么就可以在张三和请假单之间建立一个待审关系 他们之间的关系也是一对多的关系,因为张三可以同时审核几个请假单,就是这意思,一个请假单等待的用户是一个,从现在的需求来看。那么两者之间还有另外一个联系那就是已审,一个用户可以审批过多个请假单,请假单也可以被多个用户审批

4、比如张三审批以后交给李四审批,李四审批以后交给王五审批,其实这个已审就是记录审批信息的,比如审批时间,审批意见,把它放在审批关联里边 这个就是一个基本的概念,了解这个概念之后我们就考虑它的设计,JBPM实际上就是协助我们把这个请假单从一个用户手上转递到另一个用户手上。当把这个模型分析清楚了我们就要去实现它。 这里重点分析提交,怎样去提交,在SSH架构体下,提交请假单这个业务逻辑,你可能就需要这样一个业务逻辑类,里边可能有这么一个方法专门来进行提交操作的,那么这个方法怎样设计,以及这个方法怎样去实现。了解这点你就可以了解JBPM干什么的,能给我们带来什么好处 (用自己的话说明一下

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

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

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

8、 工作流设计器 (设计流程(ROSE)、定义流程 我们是使用它,而不是自己做一个 ) 流程操作(流程引擎提供的一些API我们去调它。比如启动、结束、挂起、查询流程) 工作流客户段程序(用工作流的那些客户端。比如将jpbm集成到某个系统,那个系统对工作流引擎来说就是客户端程序) 流程监控(对流程流转进行监控) 表单设计器(表单的设计) 与表单的集成 与应用程序的集成 参考模型—WFMC 核心调度算法 1 、FMS 2 、 PetriNet(令牌,JBPM就是通过令牌来调度的,意思就是你的请假单从张三提交到李四的时候,它就是通过令牌知道的,令牌就从张三指向李四。。。我觉得应该

9、是令牌先指向李四的,或者说是同时进行的) 接下来讲解JBPM架构,我这个图是在网上找的只不过添加了一些中文注释,因为考虑到大部分人英语还是没有过六级的,但是过了六级也不一定知道的, 流程定义的基本概念 从请假流程图里面可以看出一个流程是多个点和线构成,看图上的箭头是实心的。点和线之间的关系是什么样的关系?一个点就是一个node对象,一个线就是一个transition对象。第一根线(连接开始和张三审批)第二跟线(连接张三审批和李四审批),他们的起点和终点不同,而且他们都有方向。线就是描述从一个节点到另一个节点。也就是from…to…! Node 这个节点就是普通节点 它没什么行为

10、 它的行为需要你自己来定义 (接下来按顺序解释图片上的内容)(讲到fork join 的时候要画一个带有同步杆的图)讲到任务节点的时候提问什么是任务?任务就是某件事情需要由某些人去做?就像我现在向你们提问,这就是一个任务 接下来讲解流程执行的概念 JBPM流程引擎核心调度过程(要把这部分讲清楚) 调用Processinstace()方法 首先客户端调用processinstance里面的signal方法,然后判断流程实例是否结束,然后调用这个token的signal方法,这个token的signal方法肯定是跟一个节点相关的 那么它是怎样找到这个节点的,实际上这个N

11、ode里面有一个leave方法,这个是节点里面的一个方法。但是从一个节点出发可以有多个离开的线,那它是怎样选择离开的线的?实际上在流程实例里面还有一个signal方法,这个signal方法是带参数的,里面有一个名称。所以在第1步调signal方法的时候你指定了名称,那么执行到第4步的时候他就会通过这个名称来找到那根离开的线,如果一开始没有指定名称,那么它就随机的找到一根离开的线,意思就是随机的找到一根线离开,所以它在第5步有一个任务就是找到要离开的transition。然后它离开到下一个节点也是通过名字找到transition,调用transition里面的take方法,然后就找到下一个节点,

12、调用里面的enter方法。然后到了这个节点内部他会把token指向的节点改为自身。这样token的引用就从from节点到了这个to节点。然后在这个节点里边还要执行一个excute方法,这是它内部的一个方法,这个方法就是这个节点行为的体现。因为不同的节点有不同的行为。 接下来在myeclipse上看看JBPM 到底是一个什么东西,不用你们敲代码 我来演示给你们看 设计器里面的内容(前面的这些我们已经了解过了,开始,结束什么的) 这里面就只有process State和super Stage在前面没有讲解过 process state用来连接一个子流程,因为jbpm支持把两个节点连

13、接起来,就是到一个节点以后启动一个新流程然后这个流程执行完了以后又回到这个节点 Super state讲的是这样一个过程 假如你现在有个非常复杂的流程,有几十个步骤,那么你就可以用superstate将其中一些步骤组织起来,形成一个阶段一个阶段的 接下来看source里面的内容 xmlns=“urn:jbpm.org:jpdl-3.2”这个文件在我们流程设计的时候会有一些自动的流程代码提示,去掉也没关系 name 流程定义的名字 比如请假单 报销单等 Action 相当于你要定义一个类去处理某种事情,那么把Action写到transition内部,那么它处理的就是transi

14、tion事件,这个事件在调用take方法的时候发生,在take里面只能抛出transition事件类型 如果把一个Action直接放到一个state内部,就是放到节点内部。实际上它是不清楚的,不清楚究竟在什么时候调用它,如果 你要定义在这个节点内部你要在它的外部加上一个event type="node-enter" 就是指在node-enter的时候调 接下来就来看Action里面的内容 name 名称这个东西不重要 重要的是后面的class,它就是一

15、个类,jbpm在从第一个节点转向到第二个节点,就是这里的起点转向到first节点这个过程里边会触发类里面的某个方法被调用,就是这个意思,这个类在MessageActionHandler.java里面。 (然后将页面转向到此处) 在JBPM里边action都要实现actionhandler接口 (handle:处理器处理机的意思) ActionHandle里面对应的这个方法叫做excute方法 (excute:处决)这个excute方法是jbpm主动调用的,当事件发生的时候这个方法就自动被调用 然后这个里边有个ExecutionContext,这个就是执行上下文,实际上就是执行环境,

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

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

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

19、对象一开始指向起点,这个起点称为Start 然后看下面,instance.getContextInstance().getVariable(message)。ContextInstance就是前面的流程实例变量容器, 这个message变量现在还是空的,因为transition事件还没有发生。 接下来触发流程实例往下流装,instance.signal(),触发流程往下流转,这个signal方法就会触发一系列的过程,也就是之前讲的核心调度过程,在take的时候就会抛出transition事件 到这个时候MessageActionHandler.java这个类自动被调用,这个类里面的exc

20、ute()方法就被调用了 在这个里面context.getContextInstance(),当前实例对应的contextinstance要setVariable,就是把上面的message信息放到“message”变量里面去。所以signal之后就有这样两种结果, 首先这个流程实例对应的RootToken节点已经指向了first节点, 然后,这个流程实例变量里边contextinstance变量里面的message就是下面这个值,”Going to the first state”,这个值就是我们在流程定义里面定义的,这个值先放到流程定义的message里边,然后从MessageAc

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

22、 第一个JBPM流转的的实例 建好工程,打开设计器,设计好后看节点,在节电里边定义任务 这里面的意思就是这里有个审批任务,这个任务由张三来完成 一个节点里面可以定义多个task 1、首先是创建数据库表 Jbpm01CreateTable public class Jbpm01CreateT

23、able extends TestCase { public void testCreateTable(){ //用JbpmConfiguration创建数据库表,getInstance()就通过类路径去读取配置文件 //调用这个createSchem()就能够将这些数据库表创建出来 JbpmConfiguration.getInstance().createSchema();}} 2、部署流程定义 Jbpm02DeployProcessDefinition static JbpmConfiguration jbpmConfiguration = JbpmConfigu

24、ration.getInstance(); 部署流程定义,根据流程定义文件, 解释得到的流程定义文件,把流程定义持久化到数据库 public void testDeployProcessDefinition() {ProcessDefinition def = ProcessDefinition .parseXmlResource("firstJbpm/processdefinition.xml"); JbpmContext context = jbpmConfiguration.createJbpmContext(); //jbpmContext是对hibernate se

25、ssion的封装,提供了对JBPM相关对象的持久化 try {context.deployProcessDefinition(def); } catch (Exception e) {context.setRollbackOnly();} finally {context.close();}} 首先读取这个文件,然后怎样把它持久化到数据库里面去? 凡是涉及到JBPM这些对象的持久化,都要拿到jbpmcontext,这就是入口。Hibernate里面拿到session是通过sessionFactory, 通过读取Hibernate 的配置信息拿到sessionFactory, 通过sessi

26、onFactory得到session ,通过session对对象进行持久化 在jbpm里面通过jbpmConfiguration 得到jbpmcontext对象 通常jbpmConfiguration在一个系统里边只有一个。所以把它定义成静态的 然后创建一个context对象 在最后要将context关闭 这个会导致我们的事物进行提交或回滚 然后把session关闭 如果不关闭则在数据库里边看不到相关的记录 数据库里边的一些表是放那个图里边的一些相关的数据的 我们先看些常用的,看里面有什么东西 为什么先看些常用的,因为我现在只知道这些常用的 3、创建公文 Jbpm03C

27、reateDocument public void testCreateDocument() { //JbpmContext是对hibernate session的封装,提供了对JBPM相关对象的持久化 JbpmContext context = jbpmConfiguration.createJbpmContext(); try {// 创建公文对象,创建一个公文实体类Document Document doc = new Document(); doc.setTitle("测试公文" + new Random().nextInt(9999)); context.getSess

28、ion().save(doc); // 创建流程实例对象 // 1、从数据库中加载ProcessDefinition对象 ProcessDefinition def = context.getGraphSession().findLatestProcessDefinition("firstJbpm"); // 2、根据ProcessDefinition对象,创建流程实例对象 ProcessInstance instance = new ProcessInstance(def); context.save(instance); //3、 把公文对象和流程实例对象互相绑定 doc.

29、setProcessInstanceId(instance.getId()); instance.getContextInstance().setVariable("documentId", doc.getId()); } catch (Exception e) {e.printStackTrace();context.setRollbackOnly();} finally {context.close();}} 4、提交公文 Jbpm04SubmitDocument //将公文提交到第一个环节 public void testSubmitDocument() { //Jbpm

30、Context是对hibernate session的封装,提供了对JBPM相关对象的持久化 JbpmContext context = jbpmConfiguration.createJbpmContext(); try {//已知公文 int documentId = 4; Document doc = (Document) context.getSession().load(Document.class, documentId); //得到公文对应的流程实例对象 long processInstanceId = doc.getProcessInstan

31、ceId(); ProcessInstance instance = context.getProcessInstance(processInstanceId); //将公文提交到下一个环节 instance.signal();//对于一个公文来讲只能执行一遍 } catch (Exception e) {e.printStackTrace();context.setRollbackOnly();} finally {context.close();}} 5、公文当前所处的环节 Jbpm05CurrentNode System.err.println("公文

32、"+doc.getTitle()+"】当前所处的环节是:"+instance.getRootToken().getNode().getName()+"******instance是否已经结束?---->"+instance.hasEnded()); 将公文提交到下一个环节,对于一个公文来讲只能执行一遍 6、如何得知在某个用户手上有哪些公文 Jbpm06SearchMyTaskList public void testSearchMyTaskList() { //JbpmContext是对hibernate session的封装,提供了对JBPM相关对象的持久化 J

33、bpmContext context = jbpmConfiguration.createJbpmContext(); try {//已知用户 printTask(context,"张三"); printTask(context,"李四"); printTask(context,"王五"); } catch (Exception e) {e.printStackTrace();context.setRollbackOnly();} finally {context.close();}} private void printTask(JbpmConte

34、xt context,String actorId){ List tasks = context.getTaskMgmtSession().findTaskInstances(actorId); for(Iterator iter = tasks.iterator();iter.hasNext();){ TaskInstance ti = (TaskInstance) iter.next(); Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("docu

35、mentId"); Document doc = (Document)context.getSession().load(Document.class,docId); System.err.println("流转到【"+actorId+"】手上的公文是:"+doc.getTitle());}} 7、将公文提交到下一个节点 Jbpm07NextNode public void testNextNode() { // JbpmContext是对hibernate session的封装,提供了对JBPM相关对象的持久化 JbpmContext context = jbp

36、mConfiguration.createJbpmContext(); try {// 已知用户和它要提交的公文 int documentId = 4; NextNode(context, "张三",documentId); // NextNode(context, "李四",documentId); // NextNode(context, "王五",documentId); } catch (Exception e) { e.printStackTrace(); context.setRollbackOnly();} finally {con

37、text.close();}} private void NextNode(JbpmContext context, String actorId,int documentId) { List tasks = context.getTaskMgmtSession().findTaskInstances(actorId); for (Iterator iter = tasks.iterator(); iter.hasNext();) { TaskInstance ti = (TaskInstance) iter.next(); Integer docId = (Inte

38、ger) ti.getProcessInstance() .getContextInstance().getVariable("documentId"); if(docId.equals(documentId)){ //调用taskInstance中的end(0方法有两个目的: //1、结束taskInstance对象 //2、触发当前的Token对象的singnal()方法,使得流程继续往下流转 ti.end();} Document doc = (Document) context.getSession().load(Document.class, docId); System.err.println("公文【"+doc.getTitle()+"】已被【"+actorId+"】审批完毕,现在继续往下流转");}} 11

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服