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)。
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- jBPM工作流
- JBPM工作流
- JBPM-工作流
- 【工作流】:JBPM
- 工作流--JBPM
- JBPM工作流
- JBPM工作流引擎理论基础
- jBPM工作流定义部署
- jbpm 工作流引擎
- JBPM工作流介绍
- jBPM工作流部署
- 我的嵌入式学习之路
- Unity3D开发:Unity3D中的脚本概述
- Facebook的公平份额调度器FairScheduler
- ArcGlobe三维开发之二十——输电线路二三维交互选线
- 【读书笔记】iOS应用逆向工程-分析与实践(第三章)1
- JBPM工作流
- C++回文的实现代码
- javaweb中使用Listener监听器
- zookeeper基本原理
- FZU2171 防守阵地 II (线段树)
- JS实现大数(整数)相乘
- 在String.xml中使用特殊符号
- oracle11g数据库如何正确导入dmp文件数据
- 怎样改变Tooltip的大小