在了解到jbpm的点和线后,接下来就要说说jbpm的内部结构和执行原理了。先来看看下面的整体图
● 内部结构:
1. ProcessDefinition
流程定义:定义流程规则。比如请假流程、办公流程、申报流程等。
2. ProcessInstance
流程实例:按照流程定义的规则来流转的具体信息。比如张三的请假单、张三的办公单或信息、张三的申报单等。
signal方法:按定义的流程流转工作,即将一节点流转到下一节点。
3. ContextInstance
流程实例变量容器:存放各种流程实例变量。比如某种请假单,请假人是“张三”,请假天数是“5”天等数据信息。
setVariable方法:设置实例变量。
getVariable方法:获取实例变量。
4. Token
令牌:流程流转的确定依据,当令牌由一个节点(A)指向到另一节点(B)(可抽象理解为令牌传递),便视为流程有一个节点(A)流转到下一节点(B)
signal方法:按定义的流程流转工作,实际上ProcessInstance中的signal方法调用的就是Token中的signal方法,只不过在ProcessInstance中加了一些有关流程的判断,如判断流程是否结束(令牌是否指向endState节点)等。
5. Node
节点:工作流中的7种“点”(详细见上节讲述)。
● 执行原理:
我们知道工作流实质上为我们干了两件事:定义流程、执行流程。因此原理也是围绕这两点展开的。执行步骤如下:
1. 定义流程。即定义流程的规则,作出流程图,且是基于UML的活动图来定义流程。
2. 创建流程实例。该步意义类似传统编程将定义的对象实例化(因此“流程定义”与“流程实例”的关系是一对多),但不同的是实例化后的变量并不保存在ProcessInstance里,而是存在ContextInstance中。因此在创建ProcessInstance后会同时创建一个响应的ContextInstance(二者关系是一对一)。
3. 创建流程实例的同时,也会创建该流程实例相应的Token(即rootToken)对象,这个Token一开始指向起点并且会跟某一节点相关联,调用该Token的signal方法即可实现流转。
4. 流转到节点,执行该节点本身性质的流程功能(不同的节点,执行的方法、效果都不同)。如流转到Fork节点,则该节点会创建多个(依Transition的数量而定)subToken,并分发给不同的节点;当所有subToken都流转到join节点,join节点会将其父节点流转到下一节点。
5. 若节点为taskNode节点,则会调用相应的task任务,执行业务等代码。
那么以上就是这节要讲的内容了,下一节会总结一些jbpm的具体实例。