JBPM(Java Business Process Management),业务流程管理,是Jboss(现已被Redhat收购)旗下的开源工作流引擎,是覆盖了业务流程管理,工作流,服务协议等领域的一个开源的,灵活的,易扩展的可执行流程语言框架。主要解决一些复杂,易变化等工作流程问题。
一,首先看一下工作流(workflow):
1,介绍:工作流就是工作需要遵循一定流程,需要经过层层节点,级别才能完成的。它有三个要素:a,这个过程要做什么,这是事情的主题;b,要经过多少个步骤,这是这类事情的特点;c,每个步骤都由谁来做,做什么,怎么做,这是事情节点的内容。例如一些物资的审批问题,请假的审批问题,需要经过多道关卡才能完成事,JBPM会使其变的非常简单。当然了解决工作流的问题,不仅仅有JBPM,还有OSWorkFlow,国内的普元工作流等。
2,详解:看一下工作流的理论知识吧,当然这个不仅仅JBPM是这样,所有的工作流工具都是用的这些知识,所以还是非常核心的。
a,流程定义(ProcessDefinition),基于有向图对业务进行描述,图是由节点(活动)和转移(Transition)构成的,节点是有类型的,节点的类型决定了到达该节点做的事情,不同的节点做的事情不一样,转移描述了一个流向或路径,转移表示了from … to ..的关系。这里相当于我们创建了一个类。
b,流程实例(ProcessInstance),流程实例就是流程定义的具体化,一个流程定义会有多个流程实例,相当于对上边的类进行了实例化。
c,流程变量(Process variable),流程变量保存了上下文信息,流程变量采用Map结构存储,采用键值对的方式,流程变量是流程实例的一部分,流程变量的生命周期是随着流程实例的消亡而消亡的,流程变量的值在此流程中的任何节点都可以读取和修改(和ThreadLocal类似)。
d,任务节点(Task),当流程到达该节点将会创建任务实例(TaskInstance)分别分配给参与者,(只要有人参与活动,一般就使用任务节点,因为要分配给人处理)。
e,起始节点(Start),流程定义中必须有一个起始节点,而且只能有一个。
f,结束节点(End),流程定义中可以没有结束节点,也可以有多个结束节点。
g,决策节点(Decision),决策节点是由流程自动决策的,不需要人为干预,该节点相当于if…else ….决策节点可以嵌入java代码或使用脚本语言进行判断。
h,分支节点(Fork),将一个路径可以分解为多个并发的子路径(并发任务,会签),只有所有的子路径到达联合节点(Join),主路径才会继续执行事件(Event),当流程离开、到达某个节点或执行转移的时候,都会触发事件的。
其实细细想想,这些东西和UML中的活动图的画法是非常类似ActivityDiagram的,就连那些画图的图表都是类似的。
二,JBPM4.4知识介绍:
1,数据库设计:JBPM4.4的持久层是采用的Hibernate,大大提高了程序了移植性,和数据库进行了解耦。它通过18张表进行数据处理,我们可以通过PowerDesigner进行反向工程,导出数据物理设计图,进行查看这些表之间的结构。这里仅仅看一下表的作用吧:
表名称 |
说明 |
jbpm4_deployment |
保存部署id |
jbpm4_deployprop |
部署文件相关属性 |
jbpm4_execution |
存放当前执行信息 |
jbpm4_hist_actinst |
存放历史活动(Task、State、Fork、Join等等)信息 |
jbpm4_hist_detail |
保存流程变量的变更 |
jbpm4_hist_procinst |
保存历史流程实例 |
jbpm4_hist_task |
历史任务 |
jbpm4_hist_var |
历史变量 |
jbpm4_id_group |
组 |
jbpm4_id_membership |
用户和组的关系 |
jbpm4_id_user |
用户 |
jbpm4_job |
存放timer |
jbpm4_lob |
存放流程定义的JPDL内容和流程定义图片 |
jbpm4_participation |
和用户相关 |
jbpm4_property |
Id维护表 |
jbpm4_swimlane |
存放泳道 |
jbpm4_task |
存放当前任务 |
jbpm4_variable |
存放当前流程变量 |
其中想提一下,这里的每一张表采用了没有业务含义的字段作为主键,这是大力提倡的; 数据库的命名规范都是通过下划线来区分各个单词,避免了不必要的冲突; 看这里的表有存放当前信息,存放历史信息的,体现了表的分层设计,大大提高了处理数据的效率; 最后就是主键的生成策略,这里是通过第三方表jbpm4_property来进行维护主键,这也是大大提高了其移植性等。这些表设计都是非常值得我们学习的。
2,核心类ProcessEngine,这是使用JBPM的外观接口,通过ProcessEngine来获取各种类,例如最重要的6个Service。其实就像Hibernate中的核心工厂SessionFactory,Ibatis的核心类sqlMapClient一样。通过此核心类来进行JBPM的各种处理。
3,核心的6个Service,当然了这6个Service都是通过核心类ProcessEngine创建的,主要作用如下表:
接口名称 |
作用 |
|
RepositoryService |
主要和流程定义相关,如:部署流程、删除流程、查看流程 |
|
ExecutionService |
和流程实例相关,启动流程 |
|
HistoryService |
JBPM4的数据库设计发生了改变,区分了历史表和当前表,主要适合于大量流程下的使用,HistoryService主要是查询历史的 |
|
TaskService |
|
|
IdentityService |
身份相关,创建用户、创建组、主要和我们组织机构整合时用的 |
|
ManagementService |
管理定时任务的(job) |
三,工作流的优缺点:
1,优点:
a,可以实现流程和业务逻辑的分离,分离后流程的变化不会影响到业务逻辑,业务逻辑的改变也不会影响到流程,能够更好的适应需求的变化。(体现了设计模式中的责任链模式)。
b,转变了开发的思路,使我们把更多的精力放到流程开发上,因为它进行了很大的封装。
2,缺点:
采用工作流会带来很大的开发成本和学习成本。对于一些流程变化不频繁的项目,使用工作流也体现不出它的优势。
综上为工作流的一些基础知识,JBPM的运用前必知知识,理解好工作流这方面的业务,理解好工作流实现的原理,在对以后的运用上起着非常大的作用。后边会带来工作流的运用篇。
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/268395.html