jbpm3概览
前段时间选用JBPM来做为未来项目的工作流引擎,JBPM的版本目前主要是3,4,5,因为4在很多时候有BUG,并且
官方的的documentation也是不推荐的,所以没有去看4的一些相关信息,版本5中的内容比较新,融入的东西也比较多,特别是对BPMN标准的支持,但是因为内容过多,学习的曲线度也比较大,所以从tom研发的JBPM3着手,3,4,5的三个版本几乎是完全不一样的,不可能完全的掌握,只需要理解一种工作流引擎,找到一些核心的东西进行学习,其他的相关引擎都可以触类旁通,因为他们都是程序,具有共性。
JBPM是基于UML的活动图来进行流程的设计定义的,JBPM工作流引擎的核心有2个方面,第一个是定义流程,第二
个则是解释流程,在我们使用JBPM的时候,主要也就是干的这2方面的工作,我们用设计器来定义流程,拖拽出相应的流程图,然后在业务系统当中调用JBPM的API执行在配置文件上的流程,从而实现业务流程的流转。
一、定义流程,jbpm3定义流程采用的是JPDL,之前也说过,每一种工作流引擎都有自己的一套定义流程的规则,这
些规则其实就是定义流程的语言,JBPM是基于UML的活动图,采用JPDL来定义和设计流程的。
?
图示表示这是一个很简单的UML活动图,无论是怎么去构建一个活动图,都可以看到,其实活动图里面具有2个非常基本的元素,也就是JBPM的流程定义当中也具有2个很基本的元素。第一个是节点,第二个是线,所有的活动图都是由这2个基本元素来构成的,无论活动图是简单还是复杂,都离不开这2种基本的元素。JBPM里面依然是这样,因此我们把这两个基本元素定义为,1、node,2、transition,node就是节点,transition就是线,JBPM的流程的定义都是由这2个元素构成的。
1、transition,不同的节点之间通过transition来进行联系,一般来说transition分为两种类型,一种是leaving transitio
-ns,另外一种是arriving transitions,即离开的线和到达的线,从图示可以看出,一个节点既有离开的线,而且也会有到达的线,并且一个节点可能会有多条离开的线,也可能会有多条到达的线。
2、node,节点有很多种类型,主要的类型包括,start state,end state,decision,fork,join,state,task node,
每个节点有每个节点不同的含义和不同的行为,通过这些node和transition,我们可以构造出很复杂的业务流程。start state是开始节点,end state是结束几点,开始节点只能在一个流程定义中出现一次,结束节点不能有leaving transitions。state是等待节点,当流程流转到state这种节点的时候,会停顿住,只有靠外面的力量叫他流转,才会流转到下一步。decision是条件节点,意思是该节点会定义一些条件表达式,会根据流转的信息进行表达式计算获得结果,通过结果进行判断到底是流转到哪一个环节。fork和join一般来说是成对出现的,在uml中如果出现在同一个时间把一件事情分给几个人同时完成,需要有同步杆的参与,在业务系统中一般表现为会签,多个人同时审批一个文件,相同的,在JBPM上其实也是用了同步杆,只不过名字换掉了而已,在进行分发之前的同步杆成为fork,最后任务完成聚拢之后的同步杆成为join,最重要的一个节点类型称为task node,任务节点,这个节点是完成我们的业务的节点,在这个节点当中,一个或者多个参与者共同完成一个或者多个任务,这些任务其实就是我们的业务,在我们大多数编写系统的时候,都是针对于这个task node定义的。
?
二、执行流程,意思就是利用JBPM的API来解释定义的流程,从而实现业务流程的流转。在流程执行的过程当中要明
白一些相关的术语,之前通过设计器进行设计的流程定义,我们称之为ProcessDefinition,比如一个请假流程,一个报销流程,一个某种类型的签字流程,每一种类型都是一个ProcessDefinition的对象,在业务流程流转当中,首先会根据ProcessDefinition来构造出一个叫做ProcessInstance的东西,这个东西叫做流程实例,是什么意思呢?你可以把他看成是JBPM的一个抽象事物,他的含义是依照某种规则进行流转的具体信息,从含义上比较模糊,例如,可以把某个具体的报销单,例如李磊的报销单,韩梅梅的报销单等看做成一个ProcessInstance,从一种更好理解的角度来看,在JBPM外部它是我们业务系统的一个具体的领域对象(类)的实例,在JBPM内部则可以看成是一个流程实例,即ProcessInstance,他们之间是一一对应的,当创建一个相应的领域对象的时候,也要创建一个相应的ProcessInstance与之绑定,我们如果要使得一个业务流程发生流转,其实质就是让ProcessInstance发生流转。另外一个概念叫Token,Token是令牌的意思,在JBPM3中核心调度算法由FSM和PetriNet组成,FSM是维护状态,PetriNet里面的重要核心就是Token,Token是指向当前流转环节的一个对象,他是当前环节的一个指向,一个引用,JBPM通过它来获取到当前的ProcessInstance到底流转到哪一个环节的,当创建一个ProcessInstance的时候,JBPM会自动的创建一个RootToken与之一一对应,一旦流程发生流转,RootToken的指向也会发生改变,之前说到了会签的功能,fork,join会在同一时间把一个任务同时分给几个人共同完成,当在这个时候的时候,RootToken会自行拆解成很多份小的Token,每一个Token指向一个任务节点,所有的任务节点都已经完成流转到了join的时候,小的Token又会合并成RootToken并指向join的下一个节点。这里有一个很关键和核心的东西,就是流程的流转其实质其实就是关系的维护,这句话需要多多体味。
在执行流程的时候,RootToken并不是自己把所有的事情都做完了,并不是看到流程流转了,自己把自已的引用指向
下一个环节,在执行过程当中会经过很多个JBPM的内部对象,并且利用专家模式,按照面向对象的原则,分离开了职责,使得JBPM本身的框架可读性,灵活性都非常的强。先看一下JBPM的流程流转原理:
由图示可以看出JBPM的流转过程,对于调用者而言,非常的简单,只需要调用signal方法就可以发生流转(这只是其中的流转的一种情况),之后将会把责任分散到Token,node,Transition上面,由这些对象共同来完成一个业务流程的流转工作,具体的步骤就不一一介绍,之后的API调用也可以查阅一些相关资料,只要理解到了JBPM的核心概念,使用起来是非常简单的,JBPM还有很多很多的内容,比如task,taskInstance等等,这些东西在使用JBPM的时候可以慢慢去熟悉,理解概念,懂得原理,才能驾驭任何的开源产品。