`
shusanzhan
  • 浏览: 35257 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

《转》至展翅飞翔【增】JBOSS 工作流与JBPM开发实例

阅读更多
【增】JBOSS 工作流与JBPM开发实例
    大家好,下面由我来为大家介绍开源工作流引擎JBPM的初始化使用方法。

    首先当你想学一个框架的时候一定是你要有项目来用他了,OK,那么你项目当中的流程是什么你应该清楚吧,那么当你清楚了这些的时候我们就开始我们这个最简单的例子吧。

    假如我们现在有这么一个例子,公司员工想报销点出差费,那么他要将他的申请提交给他的第一级领导——部门主管去审批。

    然后部门主管审批完了之后还要交给这个部门主管的上级公司老总进行审批。那么针对这个简单的流程,我们应该从哪里下手呢?



    首先第一件事情就是写流程定义文件,那么这个文件我们用什么来写呢,他就是一个符合某个语法的xml文件,幸运的是jbpm给我们提供了一个集成的开发环境让我们来用。

    首先去官网上下一个jbpm-jpdl-suite-3.2.GA包,解压后你会发现他里面有一个designer文件夹,那个里面就是我们写流程定义文件的开发环境,他是一个eclipse的插件。

    但是好像他给我们的那个eclipse版本有问题,建议大家从新下一个eclipse-SDK-3.2.1-win32.zip这个版本的eclipse,然后覆盖他给我们提供的那个。

    准备工作做完了,那么我们就开始吧,首先我们打开解压目录下的designer文件夹中的designer.bat文件,他弹出一个eclipse,然后我们就用这个东西来开发我们的流程定义文件了。



    打开之后你就会看见一个他的小例子,不过我们不去用他,我们自己新建一个工程。右键-new-other-jBoss jbpm-process project。这个时候你会看见他弹出一个对话框,输入你的工程名字,然后点击next,这个时候你会发现他已经把jbpm加载进去了,记住要选中 Generate simple ......。

    工程建立完了,我们开始建立我们的流程定义文件。在工程里面你会发现src/main/jpdl这个source folder,然后你会看见他里面已经有了一个流程定义文件了,但是我们不去用他的。

    我们自己建立一个,右键src/main/jpdl,然后new-other- jBoss jbpm-process definition。这个时候他就会弹出一个对话框,起一个你要写的流程定义文件的名字输入进去,OK,可以了。这个时候你打开你建立的那个文件夹,里 面就有processdefinition.xml文件,ok,打开他。

    在右面的图里面你就可以看到一张什么都没有的白纸,我们看看这部分左面的那些东西,什么start,end,tasknode,fork,join。

    那我们来解释一下这是个什么东西呢,我们看看我们的需求,员工要写一个报销单,然后交给部门主管来处理,那么部门主管就应该算是一个tasknode,他就是一个任务节点。

    start和end其实就是一个虚状态,当我们写完报销单的时候我们就提交了,这个时候他就到了第一个tasknode这个节点了。然后他审批完了还要交给总经理审批,那么他又是一个tasknode,然后总经理审批完了结束,ok,是一个end。

    start--》tasknode(部门主管审批)--》tasknode(总经理审批)--》end。




    如果觉得看的有点模糊可以看看我传上来的那个图。然后你在这个试图框的下面可以看到有个source,点击一下,就会发现他已经自动的给你生成xml代码了。

    但是这样还是有点不够,我们只是定义了一个tasknode节点,并没有定义tasknode节点的任务由谁来做。那么我们还要定义一个tasknode节点是由谁来做的:
那么这段代码是这么写的:




   

<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns=""  name="test1">
   <start-state name="start">
      <transition name="" to="部门经理审批"></transition>
   </start-state>
   <task-node name="部门经理审批">
      <task>
       <assigment actorId="部门经理"></assigment>
      </task>
      <transition name="" to="总经理审批"></transition>
   </task-node>
   <task-node name="总经理审批">
      <task>
       <assigment actorId="总经理"></assigment>
      </task>
      <transition name="" to="end1"></transition>
   </task-node>
   <end-state name="end1"></end-state>
</process-definition>





这样的话我们的流程定义文件就定义完了,但是这只是把文件定义完了,系统并不知道啊,所以我们还要把我们的文件部署到系统中去。



首先我们在src/main/java里面新建立一个包,然后建立一个class,随便起个名字,就叫 TestJBPM_01吧,那么在这个类里面我们要做的是什么呢?我们要先导入表,因为jbpm要运行就要用到很多个表,ok,那么我们这个里面导入表和 hibernate导入表是差不多的,它的代码是这样的:

package com.jbpm.test;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
public class TestJbpm_01 extends TestCase {

public void testJbpm(){
 
  //创建jbpm数据库表。他就像hibernate里面的哪个export一样。实际上他就是hibernate里面的哪个export。
  //应为他映射了很多个表,所以我们就能创建那么多个表。
  JbpmConfiguration.getInstance().createSchema();
 
}
}

    然后呢我们就开始部署我们的流程定义文件,我们将这个文件当中的内容呢放到数据库当中去,当我们以后再用的时候呢我们就随时的将它加载出来。

package com.jbpm.test;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
public class TestJbpm_02 extends TestCase {

//jbpmConfiguration对象的创建
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

public void testJbpm(){
 
  //然后我们把processDefinition里面相关的对象持久化到数据库里面去。
  //流程定义文件里面有很多个概念,他有node,有transition,还有processDefinition,那么我们不需要一个
  //一个保存,jbpm把保存这么多对象的方法封装成一个接口,叫做deployProcessDefinition。我们只要调用这个
  //方法,传一个processDefinition对象,我们就能将他们存入到数据库里面去。
 
  //这个首先第一步我们要得到一个processDefinition对象,然后我们把他部署到流程中去。
  ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("testJBPM/testJbpm.xml");
  //我们要存就必须获得一个session对象,而jbpm已经把session对象封装到一个JbpmContext对象里面了。
  //那么这个jbpmContext对象是怎么得到的呢,我们要先有一个jbpmConfiguration对象,我们要对数据库进行
  //操作的时候一定要有jbpmConfiguration这个对象,用他来创建一个类似于hibernate当中的session一样的
  //对象——jbpmContext。他是我们对数据库所有的操作的一个接口。
  JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  try{
   //然后部署的操作已经由jbpmContext给我们创建好了,我们只需要调一下他的一个方法就可以了。
   jbpmContext.deployProcessDefinition(processDefinition);
  }finally{
   //最后我们还要对他close一下,就像我们用hibernate的时候要close session一样。
   jbpmContext.close();
  }
}
}


第二步我们也做完了,那么现在我们开始做第三步,也就是说,我们流程定义文件写好了,现在我们的系统当中有了这样一个报销流程。

那么就开始实际的去用她吧,一个人小报销了,那么她就要写一个报销的申请,但是这个 报销的申请写完了存到数据库当中了还不能算完了,应该和我们的这个流程关联起来啊,那么她应该怎么去关联呢,我们在建立这个申请单这个类的时候应该定义一 个processInstanceId属性,她是一个long型的。

记录这我们的这个流程实例的id,那么什么是流程实例 (processInstance)呢,她是我们工作流当中第二重要的概念,他和流程定义的关系就相当于对象和类之间的关系,类是一个抽象的东西,她定义 完了是什么也干不了的,要想用她内部定义的东西我们就要new出一个实例来,当然这个里面也是这样的。

那么也就是说,当我们创建这个报销申请的时候我们就要先根据这个流程‘new’出一个流程实例来存到数据库当中,然后在把她的id传给报销申请对象然后再将这个报销申请对象存到数据库当中。那么这个代码是这样的:

package com.jbpm.test;
import junit.framework.TestCase;
import org.hibernate.Session;
public class TestJbpm_03 extends TestCase {

public void testJbpm(){
  Session session = null;
  try{
   session = HibernateUtil.getSession();
   session.beginTransaction();
  
   Document doc = new Document();
   doc.setTitle("title3");
   doc.setContent("this is content3");
   session.save(doc);     
   session.getTransaction().commit();
  }catch(Exception e){
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally{
   HibernateUtil.closeSession(session);
  }
}
}

package com.jbpm.test;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
/**
/*
/*将申请单和流程实例绑定
**/

public class TestJbpm_04 extends TestCase {

static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

public void testJbpm(){
 
  JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  jbpmContext.setSessionFactory(HibernateUtil.getSessionFactory());
  try {
   ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("testJbpm");
   ProcessInstance processInstance = new ProcessInstance(processDefinition);
   jbpmContext.save(processInstance); 
  
  
   //将我们的document和instance绑定。
   long processInstanceId = processInstance.getId();
   Document document = (Document)jbpmContext.getSession().load(Document.class,1);
   document.setProcessInstanceId(processInstanceId);
   jbpmContext.getSession().update(document);
   processInstance.getContextInstance().setVariable("document", document.getId());
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   jbpmContext.close();
  }
 
}
}

现在我们的申请已经和实例关联起来了,那么接下来的下一步就开始用啦,就是让 这个申请流转起来吧,那么她应该怎么去流转呢,嘿嘿,jbpm给我们提供一个signal方法,每当执行一次这个方法的时候她就流转一下到下一个节点,你 可以打印出当前节点试一下,看看是不是执行一次你的当前节点就换一下。这段代码是这样的:

package com.jbpm.test;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;
public class TestJbpm_05 extends TestCase {

static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

public void testJbpm(){
  JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  jbpmContext.setSessionFactory(HibernateUtil.getSessionFactory());
  try{
  
   Document document = (Document)jbpmContext.getSession().load(Document.class, 3);
   long processInstanceId = document.getProcessInstanceId();
   ProcessInstance processInstance = jbpmContext.getProcessInstance(processInstanceId);
   processInstance.signal();
  }finally{
   jbpmContext.close();
  }
}
}
分享到:
评论

相关推荐

    工作流与JBPM开发实例精解.docx

    ### 工作流与JBPM开发实例精解 #### 一、引言 在软件开发领域,特别是企业级应用开发中,工作流管理扮演着极其重要的角色。它可以帮助组织优化业务流程,提高工作效率。JBPM作为一款开源的工作流引擎,为开发者...

    jbpm开发实例详解

    jbpm是一个开源的工作流管理系统,由JBoss组织开发,遵循LGPL许可证。它提供了丰富的功能,包括对流程的建模、执行和监控。自4.0版本开始,jbpm引入了Process Virtual Machine (PVM)的概念,支持使用jPDL(jbpm ...

    Spring与JBoss JBPM工作流集成开发指南

    Spring与JBoss JBPM工作流集成开发指南是关于JBPM与Spring框架集成的开发文档,涵盖了工作流的基本概念、设计要点、常见问题解答、参考资源等。下面是从该文件中生成的相关知识点: 一、工作流管理系统 工作流管理...

    工作流框架JBoss+jBPM+jPDL用户开发手册

    《工作流框架JBoss+jBPM+jPDL用户开发手册》是针对企业级应用中工作流管理系统设计与实现的一份详尽指南。本手册旨在帮助开发者深入理解和运用JBoss、jBPM以及jPDL这三者之间的协作,构建高效的工作流程自动化解决...

    JBoss jBPM

    JBoss jBPM 是一个复杂的可扩展的工作流管理系统. JBoss jBPM 有直观的流程语言来表示商业流程图的术语比如,任务,异步通讯的等待状态,定时器,自动操作等等.把这些操作绑在一起,, JBoss jBPM 就有了最强大和易扩展性...

    基于JBOSS_jBPM工作流技术的改进和应用

    基于JBOSS_jBPM工作流技术的改进和应用基于JBOSS_jBPM工作流技术的改进和应用

    工作流JBPM开发计划书

    ### 工作流JBPM开发计划书 #### 一、项目背景与目标 在当前数字化转型的大背景下,企业越来越依赖于高效的工作流程管理来提升业务效率和服务质量。JBPM(JBoss流程管理)作为一款开源的工作流引擎,因其灵活性、可...

    jbpm 5.0 jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版

    jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版

    jbpm-4.3-src.rar_bdf-jbpm4 src _jboss 4.3_jboss jbpm4.3_jbpm-4.3

    jbpm-4.3-src.rar_bdf-jbpm4 src _jboss 4.3_jboss jbpm4.3_jbpm-4.3 这个压缩包文件包含的是JBOSS jBPM4.3的源代码,这是一个用于业务流程管理(BPM)的开源框架。jBPM是一个强大的工具,它提供了流程定义、执行和...

    工作流开发jbpm工作流开发jbpm

    ### jBPM工作流开发详解 #### 一、引言 随着企业业务流程日益复杂,工作流管理系统(Workflow Management System, WfMS)逐渐成为提高工作效率、实现业务自动化的重要手段。jBPM作为一款功能强大的开源工作流引擎...

    JBoss_jBPM_jPDL用户开发手册_3.2.3.pdf 中文-(转)zhangym

    **JBoss、jBPM与jPDL:工作流管理的核心技术** JBoss是一个开源的企业级Java应用服务器,它提供了一个全面的中间件平台,支持Java EE(Java Platform, Enterprise Edition)规范。jBPM(Java Business Process ...

    JBoss jBPM 实例说明

    ### JBoss jBPM 实例说明 #### 一、引言与背景介绍 JBoss jBPM 是一款开源的工作流和业务流程管理(Business Process Management, BPM)系统,旨在为开发者提供灵活且强大的流程管理解决方案。本文档将详细介绍 ...

    jBPM1-工作流与JBPM.ppt

    jBPM(Java Business Process Management)是Jboss推出的一个开源工作流管理系统,它提供了对企业经营过程的建模、执行和监控能力。通过jBPM,可以实现业务逻辑和过程逻辑的分离,使得在不改变具体功能实现的前提下...

    工作流JBPM中文开发指南

    【JBPM工作流开发指南】是一本专注于介绍JBPM(Java Business Process Management)的书籍,旨在帮助开发者理解和应用这一强大的工作流管理系统。JBPM是一种开源的业务流程管理系统,它允许组织设计、部署和执行复杂...

    JBossjBPM.rar_工作流引擎

    在提供的压缩包中,“JBossjBPM.nh”可能是一个笔记或文档文件,详细介绍了在实际项目中使用JBoss jBPM的经验和技巧。通常,这种文件会涵盖以下内容: 1. 安装与配置:如何在本地环境中设置jBPM,包括依赖库的导入和...

    jBPM工作流应用开发指南

    《jBPM工作流应用开发指南》是一本面向初学者的文档,旨在帮助开发者快速掌握jBPM工作流系统的开发技巧。jBMP,全称Java Business Process Management,是开源组织JBoss提供的一款用于业务流程管理(BPM)的框架,它...

    JBoss 工作流jbpm4帮助文档

    jbpm4 API ,帮助文档,有时间大家共同切磋下啊。呵呵

Global site tag (gtag.js) - Google Analytics