JBPM-工作流

来源:互联网 发布:陈路 微屏软件 编辑:程序博客网 时间:2024/05/17 01:12

1. JBPM基础

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

2. JBPM4.4开发环境

2.1 相关资源

  1. jbpm-4.4.zip下载地址:http://pan.baidu.com/s/1dEbrayH
  2. 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

0 0
原创粉丝点击