`
fjilyfe
  • 浏览: 40057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工作流与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();
		}
	}
}

Ok,第二步我们也做完了,那么现在我们开始做第三步,也就是说,我们流程定义文件写好了,现在我们的系统当中有了这样一个报销流程,那么就开始实际的去用她吧,一个人小报销了,那么她就要写一个报销的申请,但是这个报销的申请写完了存到数据库当中了还不能算完了,应该和我们的这个流程关联起来啊,那么她应该怎么去关联呢,嘿嘿,是这样地:我们在建立这个申请单这个类的时候应该定义一个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的简单例子就到这里了,有什么问题大家可以给我留留言,还请大家多多指教小弟啊。后面我还会写点更具体的一些问题,比如说列出提交到这个人这还没有审批的公文啊,还有如果有多个分支的话应该怎么去做啊等等等等。


    
   
  • 大小: 20.8 KB
分享到:
评论
18 楼 altr 2008-05-28  
楼主写的不错,很有收获,呵呵,希望早日看到新的大作。
17 楼 janver45 2008-05-26  
太好了,非常欣赏作者这种造福大众的行为!
16 楼 展翅雕翎 2008-05-22  
coloic 写道
兄弟,还感觉不错,我之前一直在了解这个东西,但没有实作过
只是用过人家的现成了的工作流组件,感觉就是傻瓜操作,学不到东西,所以看了你的,还感觉不错,希望以后继续分享你的经验。有机会成立一个JBPM的群

貌似已经有一个了吧。
15 楼 展翅雕翎 2008-05-22  
楼主写的通俗易懂,赞一个。呵呵
14 楼 coloic 2008-05-22  
兄弟,还感觉不错,我之前一直在了解这个东西,但没有实作过
只是用过人家的现成了的工作流组件,感觉就是傻瓜操作,学不到东西,所以看了你的,还感觉不错,希望以后继续分享你的经验。有机会成立一个JBPM的群
13 楼 linliangyi2007 2008-05-21  
isky 写道
http://linliangyi2007.iteye.com/blog/176345   你看看  林信良的博客


首先感谢这位兄弟推荐偶滴blog,但偶不是林信良(良格葛)哈!

还有建议楼主在写工作流的时候,对一些图型化的描述,我想读的人会更多些
12 楼 Hunk.Chen 2008-05-20  
学习中,等整理出一些东西,也会拿来共享的
11 楼 lingyifei117 2008-05-20  
多谢!我们有个项目也用到流程了!
10 楼 fjilyfe 2008-05-17  
谢谢大家啦,小弟会努力地!
9 楼 spiritfrog 2008-05-16  
流程跟申请单的结合还算讲的比较清楚,不过流程扭转不是用process.signal,应该用task.end(transition);process.signal用的roottoken.signal(默认的transition),一般都是用task驱动流程走动的。

8 楼 y263542662 2008-05-16  
我以前写过个例子.

比你流程复杂点. 只可惜学了段时间就没用了.

呵呵. lz 继续加油

希望你在jbpm领域的新的突破.
7 楼 ttitfly 2008-05-16  
写的还不错,通俗易懂,期待后文:)
6 楼 yujianqiu 2008-05-16  
我们的项目里也在用,等过些时间也写点东西,分享一下。
5 楼 blackdtj 2008-05-16  
学了一段时间,觉得是一个很好的东西,就是项目中一直没有机会用上,呵呵
4 楼 senbao18 2008-05-16  
呵呵,不错不错,人气来了哈
3 楼 Leapiny 2008-05-15  
多谢,快速看了一遍,之看明白了前面一部分,后面一半再仔细看看,一直想学习一下这个东西。 :)
2 楼 isky 2008-05-15  
http://linliangyi2007.iteye.com/blog/176345   你看看  林信良的博客
1 楼 onelee 2008-05-15  
  

相关推荐

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

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

    jbpm开发实例详解

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

    工作流JBPM开发计划书

    ##### 2.2 对JBPM工作流的二次开发 - **功能扩展**:根据业务需求,开发新的功能模块,如自定义活动类型、动态任务分配等。 - **流程定义工具**:设计图形化界面工具,简化流程的设计与维护过程。 - **流程实例监控...

    jbpm开发实例源码

    【jbpm开发实例源码】是一个关于jbpm的实践项目,旨在帮助开发者深入理解并掌握jbpm的工作流引擎。jbpm(Java Business Process Management)是一个开源的企业级工作流管理系统,它提供了一整套用于设计、执行、管理...

    eclipse工作流插件 含jBPM_4.4_开发指南

    本指南将深入探讨如何利用Eclipse与jBPM 4.4版本相结合,实现高效的工作流应用开发。 首先,我们要理解jBPM是什么。jBPM是一个开源的工作流管理系统,它提供了对业务流程建模、执行和监控的全面支持。jBPM 4.4是其...

    jBPM4工作流应用开发指南.pdf

    - **jBPM4工作流应用开发指南:** 表明这是一个专注于jBPM4版本的工作流应用开发的指南,由胡奇编写。 - **胡奇:** 该标签重复提及胡奇,强化了指南作者的身份和该作品的关联性。 ### 部分内容知识点: 由于提供...

    工作流jbpm应用的实例

    工作流jbpm应用实例解析 工作流jbpm(Java Business Process Management)是一种开源的工作流管理系统,主要用于设计、执行和管理业务流程。jbpm是基于Java技术的,它提供了丰富的API和图形化工具,使得开发者可以...

    jBPM4.4开发实例

    jBPM4.4是该框架的一个版本,它提供了强大的工作流服务,包括流程定义、流程实例管理、任务处理、事件处理以及规则集成等。在这个入门开发实例中,我们将探讨如何利用jBPM4.4进行业务流程的建模、部署和执行。 **一...

    jbpm工作流整合

    jbpm工作流整合是一个关键的主题,它涉及到企业级业务流程管理(BPM)系统的实施与集成。jbpm是一个开源的工作流管理系统,它提供了一套全面的工具和框架,用于设计、执行、监控和优化业务流程。这个压缩包可能包含...

    jbpm开发指南 jbpm 工作流 自定义

    jbpm开发指南 jbpm开发指南 jbpm 工作流 自定义

    工作流引擎jbpm学习笔记

    工作流引擎jbpm学习笔记 jbpm是一个专业的工作流引擎...jbpm是一个专业的工作流引擎,可以帮助我们简化工作流程的开发和维护,提高工作效率和可扩展性。它可以定义、管理和执行业务流程,提高公文流转的效率和可靠性。

    JBPM综合实例 OA工作流系统源码

    将JBPM与SSH整合,可以充分利用各自的优势,提高开发效率和系统的可维护性。 在jbpm2这个压缩包中,我们可能会找到以下关键文件和目录: 1. **jbpm流程定义文件(.bpmn或.bpmn2)**:这些文件使用BPMN语言定义了...

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...

    jBPM4工作流示例jbpmDemo

    **jbPM4工作流示例jbpmDemo**是一款基于jBPM4的工作流管理系统实例,旨在帮助用户深入了解和掌握jBPM4工作流引擎的使用方法。jBPM4是一款强大的开源工作流管理系统,它提供了流程建模、执行以及监控等功能,广泛应用...

    JBPM综合实例 OA工作流系统源码JAR包-2

    JBPM综合实例 OA工作流系统源码JAR包-2JBPM综合实例 OA工作流系统源码JAR包-2JBPM综合实例 OA工作流系统源码JAR包-2JBPM综合实例 OA工作流系统源码JAR包-2

    jbpm工作流简单实例

    **jbpm工作流实例开发步骤** 1. **环境准备**: 首先,需要安装并配置jbpm开发环境,包括JDK、Maven、Eclipse或IntelliJ IDEA以及jbpm相关库。 2. **流程定义**: 使用BPMN编辑工具(如Eclipse BPMN2插件)绘制流程...

    请假工作流JBPM整合SSH2完整实例

    【标题】"请假工作流JBPM整合SSH2完整实例"涉及了多个IT领域的关键技术,主要集中在企业级应用开发上。JBPM(Java Business Process Management)是用于业务流程管理的开源框架,而SSH2则指的是Spring、Struts和...

    jBPM工作流详解

    jBPM,全称Java Business Process Management,是Red Hat公司开发的一款开源的工作流管理系统,它提供了对业务流程的建模、执行和监控能力。jBPM不仅支持传统的工作流标准,如BPMN 2.0,还集成了Java服务、事件处理...

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

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

    工作流(jbpm)请假流程实例

    jbpm与SSH(Spring、Struts、Hibernate)框架的结合,提供了强大的后端支持,实现了一个请假流程的应用实例。 SSH框架是Web开发中的经典组合,Spring提供依赖注入和事务管理,Struts负责MVC模式的实现,Hibernate则...

Global site tag (gtag.js) - Google Analytics