您的位置:首页 > 产品设计 > 产品经理

JBPM-工作流

2016-02-24 22:28 651 查看

1. JBPM基础

  JBPM,全称是Java Business Process Management(业务流程管理),工作流(Workflow)即业务过程的部分或整体在计算机应用环境下的自动化。基于Java的业务流程管理系统,使用Hibernate来管理它的数据库,通过Hibernate,jBPM将数据的管理职能分离出去,自己专注于商务逻辑的处理。

2. JBPM4.4开发环境

2.1 相关资源

jbpm-4.4.zip下载地址:http://pan.baidu.com/s/1dEbrayH

Eclipse(eclipse-jee-luna-SR2-win32-x86_64) 下载地址:http://pan.baidu.com/s/1i4yP3DV

(这里我把 Eclipse设置成UTF-8编码了)

2.2 安装插件

在jbpm解压目录找到JBPM_HOME\install\src\gpd\jbpm-gpd-site.zip

然后在Eclipse安装,安装时记得断开网络连接如图:



添加jPDL4.4 Schema校验 :

在jbpm解压目录找到JBPM_HOME/src/jpdl-4.4.xsd



3 配置运行环境

 新建Web工程添加相应的Jar包依赖库,和配置文件jar包从JBPM_HOME/lib/文件夹下拷贝

 配置文件从JBPM_HOME/examples/src下拷贝

 jbpm.cfg.xml、

 logging.properties、

 jbpm.hibernate.cfg.xml。

如图:



4 流程核心概念

4.1 流程定义 ProcessDefinition

4.1.1 process(流程)

是.jpdl.xml的根元素,指定的属性有:

 name:流程定义的名称

 key:流程定义的key,如未指定,则默认为name的值

 version:版本,如果指定,则不能与已有的流程定义的版本重复;如未指定,则此key的流程定义的第1个为版本1,以后的是版本递增(每次加1)

4.1.2 transition(连线、转移)

  一个活动中可以指定一个或多个Transition(Start中只能有一个,End中没有)。

   • 开始活动中只能有一个Transition。

   • 结束活动中没有Transition。

   • 其他活动中有1条或多条Transition

  如果只有一个,则可以不指定名称(名称是null);如果有多个,则要分别指定唯一的名称。

4.1.3 流程活动的控制

  • start(开始活动)

  代表流程的开始边界,一个流程有且只能有一个Start活动。开始活动只能指定一个Transition。在流程实例启动后,会自动的使用这个唯一的Transition离开开始活动,到一下个活动

  • end、end-error、end-cancel(结束活动)

  代表流程的结束边界,可以有多个,也可以没有。如果有多个,则到达任一个结束活动,整个流程就都结束了;如果没有,则到达最后那个没有Transition的活动,流程就结束了

  • task(任务活动)

  任务节点,相关属性assignee任务受理人,name任务名称

  • decision(判断活动)

  使用表达式判断流程的走向,如:expr=”#{‘to state2’}”,此外还可以使用Handler,要实现DecisionHandler接口

  • fork、join(分支/聚合活动)

  这是多个分支并行(同时)执行的,并且所有的分支Execution都到Join活动后才离向后执行。

4.1.4 事件

… … 待补充 … …

注:关于 Eclipse画流程图中文乱码的问题,修改Eclipse初始化文件添加
-Dfile.encoding=UTF-8
即可



  设计一个简单的请假流程,首先流程中有学生、班主任、教务处、教务处领导四种角色,学生请假先经由班主任的批准,然后提交到教务处,最终由领导决定;班主任请请假直接提交到教务处,由领导批准。

如图:



<?xml version="1.0" encoding="UTF-8"?>
<process name="leave" xmlns="http://jbpm.org/4.4/jpdl">
<start g="274,5,48,48" name="start1">
<transition g="-60,-10" name="申请请假" to="请假"/>
</start>
<task assignee="JBPM_Leave_Form" g="244,79,107,52" name="请假">
<transition g="-59,-12" name="提交申请" to="exclusive1"/>
</task>
<decision g="274,155,48,48" name="exclusive1" expr="#{isTeacher == 1 ? '提交班主任' : '提交教务处'}">
<transition g="-53,-19" name="提交班主任" to="班主任"/>
<transition g="2,-19" name="提交教务处" to="教务处"/>
</decision>
<task assignee="JBPM_Teacher" g="174,225,92,52" name="班主任">
<transition g="-31,-19" name="班主任同意" to="教务处"/>
<transition g="221,368:-48,-38" name="班主任驳回" to="end1"/>
</task>
<task assignee="JBPM_OfficeOfAffair" g="352,225,92,52" name="教务处">
<transition g="9,-12" name="提交教务处领导" to="教务处领导"/>
<transition g="297,339:-8,-33" name="教务处驳回" to="end1"/>
</task>
<task assignee="JBPM_OfficeOfAffairLeader" g="345,330,104,52" name="教务处领导">
<transition g="-16,-9" name="教务处领导同意" to="end1"/>
</task>
<end g="276,424,48,48" name="end1"/>
</process>


4.1 流程部署

  首先初始化数据库,建立流程相关的表(结尾有相关的表说明),有两种方式:

  1. 手动执行相应的sql文件,文件目录为JBPM_HOME\install\src\db\create

  2. 使用 hibernate 自动建表,这里使用自动建表,在jbpm.hibernate.cfg.xml中配置:hibernate.hbm2ddl.auto=update。

连接Mysql创建数据库 dbleave



public class Deploy {
public static void main(String[] args) {
//使用默认的配置jbpm.cfg.xml获取engine,单例
ProcessEngine processEngine = Configuration.getProcessEngine();
//部署流程到数据库
String deployId = processEngine.getRepositoryService()
.createDeployment().addResourceFromClasspath("leave.jpdl.xml")
.deploy();
System.out.println("deployId======="+deployId);
}
}


直接运行,就把相关流程信息存储到数据库了,部署结束后,数据库信息如图:相关表说明



4.2 JBPM操作

  JBPM的操作都是通过Service完成的,以下是获取Service的方式和各Service的用途:

  首先获取流程引擎 ProcessEngine

  ① RepositoryService:管理部署对象和流程定义

  ② ExecutionService:管理执行的,包括启动、推进、删除Execution等操作

  ③ TaskService :管理任务的

  ④ HistoryService:历史管理(执行完的数据管理,主要是查询)

RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();


4.3 流程实例的执行

  流程实例创建后,直接就到开始活动后的第一个活动,不会在开始活动停留。

1. 流程启动

  使用指定的 key 启动流程实例(不特殊指定key的值,其与流程name相同),在流程启动的时候,可以设置一些流程变量,如请假人名字、请假天数等

//1> 不附加流程变量
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processName);

//2> 附加流程变量
Map<String, Object> result = new HashMap<String, Object>();
// 通过ExecutionService启动流程实例,并设置一些流程变量
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processName, variables);


2. 走一步流程

http://my.oschina.net/yangzhiyuan/blog/213817?fromerr=OqvJ1yoc#OSC_h4_24
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: