JBPM工作流

来源:互联网 发布:新手如何经营淘宝网店 编辑:程序博客网 时间:2024/05/16 15:17

    初次接触工作流是在OA中,现在再为简略的总结一下,这篇文章要说的是JBPM宏观结构、简单实例、扩展使用三部分。

JBPM

    Java Business Process Management,覆盖了业务流程管理、工作流、服务协作等领域,并且是一个开源的、灵活的、易扩展的流程语言框架。

    简单的说,JBPM是一个框架,结合hibernate、数据库、流程图、描述语言等,专门处理与工作流有关的问题。

JPDL

    JBoss jBPM Process Definition Language,用于构建jBPM的流程语言,既然是语言,必然要有控制结构、语法、变量等概念,它把一个工作流看作是UML状态图,jPdl的作用就是定义状态图的每个部分,如起始、结束状态。

    它的语言的作用可以是通过拖拽组件或编辑XML文件的方式实现,如通过流程传递,实现顺序结构,详见以下实例。

核心内容

    以一张图的方式展示JBPM的核心内容,如下:

 

    如上所示,JBPM按照既定的流程图,通过封装的8个核心对象,以Hibernate的方式操作数据库,将各个流程的操作持久化,保存到数据库中。

    如有兴趣,可以按照流程的传递,去跟踪流程和任务在数据中转移的顺序,加深对JBPM的了解。

简单使用

    语言定义

<?xml version="1.0" encoding="UTF-8"?><process key="test" name="test1" xmlns="http://jbpm.org/4.4/jpdl">   <start g="284,14,48,48" name="start1">      <transition g="-52,-22" name="提交给一级主管" to="一级主管审批"/>   </start>   <task assignee="A" g="262,107,92,52" name="一级主管审批">      <transition g="-68,-8" name="提交到二级主管" to="二级主管审批"/>   </task>   <task assignee="B" g="263,193,92,52" name="二级主管审批">      <transition g="-37,-11" name="通过" to="end1"/>   </task>   <end g="286,281,48,48" name="end1"/></process>

    流程图片

    

    ServiceFactory

    用于创建各个对象。

package com.tgb.jbpm;import junit.framework.TestCase;import org.jbpm.api.Configuration;import org.jbpm.api.ExecutionService;import org.jbpm.api.ProcessEngine;import org.jbpm.api.RepositoryService;import org.jbpm.api.TaskService;public class ServiceFactory extends TestCase {private ProcessEngine processEngine;private RepositoryService repositoryService;private ExecutionService executionService;private TaskService taskService;/*** * 得到各个服务对象 */protected void startUp(){processEngine=Configuration.getProcessEngine();repositoryService=processEngine.getRepositoryService();executionService=processEngine.getExecutionService();taskService=processEngine.getTaskService();}//此处省略getter和setter}

    TestFlow

    测试各个流程步骤所产生的结果。

package com.tgb.jbpm;import java.util.List;import org.jbpm.api.ProcessInstance;import org.jbpm.api.task.Task;public class TestFlow extends ServiceFactory {protected String instanceId;protected String taskId;/*** * 按步骤的流程 */public void flow(){//初始化服务startUp();//部署工作流deploy();//创建工作流实例createInstanceByKey();//查询A下的任务getTasksByPersonId();//结束任务“一级主管审批”completeTaskById();//查询工作流实例所在的任务实例getCurrentTaskByInstanceId();}/*** * 部署工作流 */public void deploy(){getRepositoryService().createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy();System.out.println("工作流已经成功部署!");}/*** * 创建流程实例,保存实例Id */public void createInstanceByKey(){ProcessInstance processInstance=getExecutionService().startProcessInstanceByKey("test");instanceId=processInstance.getId();System.out.println("已成功创建新实例,Id为:"+processInstance.getId());}/**** * 得到任务实例信息 */public void getTasksByPersonId(){List<Task> task=getTaskService().findPersonalTasks("A"); taskId=task.get(0).getId();System.out.println("任务数量:"+task.size());System.out.println("任务名称:"+task.get(0).getName());System.out.println("任务人员:"+task.get(0).getAssignee());System.out.println("任务ID:"+task.get(0).getId());}/*** * 查询实例所在任务节点 */public void getCurrentTaskByInstanceId(){startUp();String activity=getExecutionService().createProcessInstanceQuery().processInstanceId(instanceId).uniqueResult().toString();System.out.println("当前所在结点为:"+activity);}/*** * 根据流程实例id结束任务 */public void completeTaskById(){startUp();getTaskService().completeTask(taskId);}}

    运行结果

工作流已经成功部署!已成功创建新实例,Id为:test.20007任务数量:2任务名称:一级主管审批任务人员:A任务ID:10002当前所在结点为:execution[test.20007]

    以上是最简单的顺序结构,你可以使用更复杂的结构,如:

    

    仔细看会发现,上述的代码写的很"死",不只是代码,工作流的定义文件中,流程"A"和"B"等也定义的很“死”,难道JBPM以如此不灵活的方式应对复杂的工作流程?当然不是,这也是下面要说的内容。

扩展使用

    文章篇幅有限,不再把JBPM的每种使用和注意事项都写一遍,但会提供以下思路:

  • JBPM支持为流程实例和任务实例添加参数,这些参数可以保存到数据库中
  • 部件如task含有form等内置属性,结合struts,可以更灵活的控制跳转
  • JBPM保存了历史数据,可以结合这些历史扩展程序的功能
  • 和EL表达式结合变量和对象使用,更灵活,如<task assignee="${admin.user}" g="262,107,92,52" name="一级主管审批">

总结    

    以上即是对JBPM大面上的总结,实例也可满足简单的使用,更多细节问题,有待在实战中发现。    


推荐:轻量级思维导图软件Blumind(803KB)。





3 0
原创粉丝点击