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

jbpm初步

    博客分类:
  • JBPM
阅读更多
公文类:

package com.wlh.jbpm;
public class Document {

	private int id;
	private String title;
	private String content;
	private String creator;
	private Long processInstanceId;
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getCreator() {
		return creator;
	}
	public void setCreator(String creator) {
		this.creator = creator;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public Long getProcessInstanceId() {
		return processInstanceId;
	}
	public void setProcessInstanceId(Long processInstanceId) {
		this.processInstanceId = processInstanceId;
	}
}

映射文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class table="T_Document" name="com.wlh.jbpm.Document">
	    <id name="id">
	      <generator class="native"/>
	    </id>
	    <property name="title"/>
	    <property name="content"/>
	    <property name="creator"/>
	    <property name="processInstanceId"/>
  </class>
</hibernate-mapping>


在hibernate.cfg.xml中添加该映射文件
<mapping resource="com/wlh/jbpm/Document.hbm.xml"/>

HibernateUtils工具类:

package com.wlh.jbpm;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	private static SessionFactory sessionFactory;
	
	static{
		Configuration conf = new Configuration().configure();
		sessionFactory = conf.buildSessionFactory();
	}
	
	public static SessionFactory getSessionFactory(){
		return sessionFactory;
	}
	
	public static Session getSession(){
		return sessionFactory.openSession();
	}
	
	public static void  closeSession(Session session){
		if(session.isOpen()){
			session.close();
		}
	}
}



通过图形界面在src/main/jpdl下创建一个流程定义Process Definition:
注意:要在每个任务节点task-node 之间加入task标签(此过程就是给节点分配参与者)

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

<process-definition
  xmlns=""  name="jbpm01">
   <start-state name="start">
      <transition name="" to="张一审批"></transition>
   </start-state>
   <task-node name="张一审批">
      <task>
        <assignment actor-id="张一"/>
      </task>
      <transition name="" to="张二审批"></transition>
   </task-node>
   <task-node name="张二审批">
       <task>
        <assignment actor-id="张二"/>
      </task>
      <transition name="" to="张三审批"></transition>
   </task-node>
   <task-node name="张三审批">
   	   <task>
        <assignment actor-id="张三"/>
      </task>
      <transition name="" to="end1"></transition>
   </task-node>
   <end-state name="end1"></end-state>
</process-definition>



使用jbpm的API创建jbpm的相关数据库表:
a.数据库链接配置修改为MySQL的配置:
   <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/jbpm</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">bjsxt</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

b.确保src/main/config下的hibernate.cfg.xml中的数据库配置和当前的数据库对应,
  如果没创建数据库,则先创建数据库和url中配置的数据库名称对应:此处为jbpm.



<property name="hibernate.connection.url">jdbc:hsqldb:mem:jbpm</property>

package com.wlh.jbpm;

import org.jbpm.JbpmConfiguration;

import junit.framework.TestCase;

.
	
    //	使用jbpm的API,创建JBPM的数据库表格,也可以使用hibernate.hbm2ddl.auto
	public void testCreateTable(){
		JbpmConfiguration.getInstance().createSchema();
	}
	
}



部署流程定义:

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;


public class Jbpm02_DeployProcessDefinition extends TestCase {

	static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();

	//将流程定义的信息持久化到JBPM数据库表
	public void testDeployDefinitionProcess(){
		//根据流程定义文件,创建ProcessDefinition对象
		ProcessDefinition processDefinition=ProcessDefinition.parseXmlResource("jbpm01/processdefinition.xml");
		//context对象类似于hibernate session对象的功能,它封装了hibernate session
		JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
		try{
			//将流程定义持久化到数据库
			jbpmContext.deployProcessDefinition(processDefinition);
		}catch(Exception e){
			//出现异常后回滚
			jbpmContext.setRollbackOnly();
		}finally{
			jbpmContext.close();
		}
		
		
		
	}
	
}

创建一个对应刚刚创建流程定义的流程实例,此过程流程实例和公文相互绑定

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;

public class Jbpm04_CreateProcessInstance extends TestCase {
	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	public void testCreateProcessInstance(){
		JbpmContext context = jbpmConfiguration.createJbpmContext();
		try{
		context.setSessionFactory(HibernateUtils.getSessionFactory());
		//从数据库中加载ProcessDefinition对象
		ProcessDefinition processDefinition=context.getGraphSession().findLatestProcessDefinition("jbpm01");
		//从流程定义对象中创建流程实例
		ProcessInstance processInstance=new ProcessInstance(processDefinition);
		//持久化流程实例对象
		context.save(processInstance);
		
		Session session=context.getSession();
		//流程实例绑定到公文对象
		Document doc=(Document) session.load(Document.class, 4);
		doc.setProcessInstanceId(processInstance.getId());
		//公文对象绑定到流程实例
		processInstance.getContextInstance().setVariable("documentId", doc.getId());
		processInstance.getContextInstance().setVariable("documentTitle", doc.getTitle());
		
		}catch(Exception e){
			context.setRollbackOnly();
		}finally{
			context.close();
		}
	}
}


提交公文:

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;

public class Jbpm05_SubmitDocument extends TestCase {

static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	//将公文提交到第一个节点
	public void testSubmitDocument(){
		JbpmContext context = jbpmConfiguration.createJbpmContext();
		try{
		context.setSessionFactory(HibernateUtils.getSessionFactory());
		Document doc=(Document) context.getSession().load(Document.class, 4);
		long processInstanceId=doc.getProcessInstanceId();
		ProcessInstance instance=context.getProcessInstance(processInstanceId);
		
		//触发流程流向下一个节点
		instance.signal();
		}catch(Exception e){
			e.printStackTrace();
			context.setRollbackOnly();
		}finally{
			context.close();
		}
		
	}
}


得到公文在流程中当前所在节点:

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;

public class Jbpm06_CurrentNode extends TestCase{
	
	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	//获得公文当前所处的节点
	public void testCurrentNode(){
		JbpmContext context = jbpmConfiguration.createJbpmContext();
		try{
			context.setSessionFactory(HibernateUtils.getSessionFactory());
			Document doc = (Document)context.getSession().load(Document.class, 4);
			long processInstanceId = doc.getProcessInstanceId();
			ProcessInstance instance = context.getProcessInstance(processInstanceId);
			System.out.println("当前节点名称="+instance.getRootToken().getNode().getName());
		   //断言的作用?方便了自动化测试,如果instance.getRootToken().getNode().getName()得到的值不是"张二审批",则会抛出异常;
		   //this.assertEquals(instance.getRootToken().getNode().getName(),"张二审批" );
		}catch(Exception e){
			e.printStackTrace();
			context.setRollbackOnly();
		}finally{
			context.close();
		}
		
	}
}


查询流动到某个参与者手上的公文列表:

package com.wlh.jbpm;

import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.taskmgmt.exe.TaskInstance;

public class Jbpm07_SearchMyTaskList extends TestCase {

	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	//查询流动到某个参与者手上的公文列表【即待审公文列表】
	public void testSearchMyTaskList(){
		JbpmContext context = jbpmConfiguration.createJbpmContext();
		try{
			context.setSessionFactory(HibernateUtils.getSessionFactory());
			
			printTask(context,"张一");
			printTask(context,"张二");
			printTask(context,"张三");
			
		}catch(Exception e){
			e.printStackTrace();
			context.setRollbackOnly();
		}finally{
			context.close();
		}
	}
	
	
	private void printTask(JbpmContext context,String actorId){
		
		//得到某个参与者(参与者对应节点)的所有任务实例,任务实例是流程实例流到某个节点(节点对应参与者)而产生的
		List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
		for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
			TaskInstance taskInstance = (TaskInstance) iter.next();
			//得到某个任务实例所在的流程实例,然后从流程实例中拿到变量的信息(对应公文信息,这里拿到的是公文的id和title)
			//为什么能拿到公文的信息呢?因为版本Jbpm04_CreateProcessInstance.java中已经将公文绑定到流程实例中了
			Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("documentId");
			String title = (String)taskInstance.getProcessInstance().getContextInstance().getVariable("documentTitle");
			System.out.println("正在等待【"+actorId+"】审批的公文是:[title="+title+",id="+docId+"]");
		}
		
	}
}


触发流程流转到下一个节点:

package com.wlh.jbpm;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;

import junit.framework.TestCase;

public class Jbpm08_NextNode extends TestCase {
	
	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	//触发流程流转到下一个节点
	public void testFlowToNextNode(){
		JbpmContext context = jbpmConfiguration.createJbpmContext();
		try{
			context.setSessionFactory(HibernateUtils.getSessionFactory());
			
			
			nextStep(context,"张二",4);//将张二待审公文流转到下一个节点
		}catch(Exception e){
			e.printStackTrace();
			context.setRollbackOnly();
		}finally{
			context.close();
		}
	}
	
	
	/**
	 * 将某个参与者手上的某个公文提交到下一个步骤
	 * @param context
	 * @param actorId 参与者id
	 * @param docId  公文id
	 */
	private void nextStep(JbpmContext context,String actorId,Integer docId){
		
		//得到某个参与者(参与者对应节点)的所有任务实例,任务实例是流程实例流到某个节点(节点对应参与者)而产生的
		List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
		for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
			TaskInstance taskInstance = (TaskInstance) iter.next();
//			
			//得到某个任务实例所在的流程实例,然后从流程实例中拿到变量的信息(对应公文信息,这里拿到的是公文的id和title)
			//为什么能拿到公文的信息呢?因为版本Jbpm04_CreateProcessInstance.java中已经将公文绑定到流程实例中了
			Integer oldDocId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("documentId");
			String title = (String)taskInstance.getProcessInstance().getContextInstance().getVariable("documentTitle");
			if(oldDocId.equals(docId)){
				//参与者的审批任务已经完成,需要结束任务实例
				//在默认的情况下,也能够触发流程流向下一个节点
				taskInstance.end();//结束任务实例
				System.err.println("公文[title="+title+",id="+docId+"]已经被【"+actorId+"】审批完成,已提交到下一个节点");
			}
		}
		
	}
}
分享到:
评论
2 楼 feilove123 2010-06-25  
请问一下解压密码是多少啊
1 楼 taga 2009-04-12  
总结的不错,是jbpm中比较常用的场景,不过需要基本概念作支撑,不然就看不明白

相关推荐

    jbpm4 web设计器的初步方案

    【jbpm4 web设计器的初步方案】主要探讨的是如何利用jbpm4框架构建一个基于Web的流程设计工具。jbPM(Java Business Process Management)是一个开源的业务流程管理系统,它允许开发者设计、执行和管理业务流程。这...

    jbpm入门实践

    通过以上步骤,你已成功完成了jbpm的初步安装和配置,可以开始探索和使用jbpm进行业务流程管理。在后续的学习中,你将更深入地了解jbpm的工作原理,如何创建和管理流程,以及如何与其他技术如Spring、Hibernate集成...

    jbpm源码阅读之一

    标题 "jbpm源码阅读之一" 提到的是对jbpm(Java Business Process Management)源代码的初步探索。jbpm是一个开源的工作流管理系统,它提供了一套完整的框架来处理业务流程,包括流程定义、执行和监控。这篇博客文章...

    jbpm 入门及帮助文档

    通过这些文档的学习,你应该能够建立起对jBPM的全面认识,并具备初步的开发能力。记住,实践是检验理论的最好方式,所以不仅要阅读文档,还要动手编写代码,模拟实际场景,这样才能更好地理解和运用jBPM。

    JBPM中文文档

    这份文档提供了一个初步理解JBPM部署和配置的指南,以及如何处理起始任务。对于想要使用JBPM的人来说,它是学习和操作这个工作流引擎的基础。为了进一步使用和优化,读者还需要掌握更多的JBPM特性,如泳道...

    JBPM4.4例子

    **JBPM4.4入门详解** JBPM,全称Java Business Process Management...通过实践这个简单的jsp+servlet例子,你将能够初步掌握如何在实际应用中使用JBPM。在学习过程中,不断探索和实践,逐步提升你的业务流程管理能力。

    Jbpm工作流实例—报销申请

    2. **部门审批**:部门经理对申请进行初步审核,确认费用的合理性和合规性。 3. **财务审核**:财务部门对申请进行财务核算,检查发票和凭证的真实性。 4. **总经理审批**:对于金额较大的报销,可能需要总经理的...

    jbpm3.1-uml.rar_jbpm_uml

    描述中提到的"jboss getting start 官方手册"可能是指JBoss BPM平台的入门指南,通常这样的手册会涵盖如何安装、配置和初步使用JBPM,包括创建流程定义、部署流程和服务集成等内容。虽然该手册并未直接提供在压缩包...

    JBPM的文档说明详细

    ### JBPM环境搭建与初步体验 #### 一、前言 JBPM(JBoss Business Process Management)是一款开源的业务流程管理引擎,它基于Java技术,能够支持多种业务流程建模语言,例如BPMN2.0。JBPM不仅提供了一个强大的...

    简单的jbpm请假流程

    完成初步的流程设计后,进行多轮测试以确保流程的正确性和效率。根据实际需求进行调整,比如增加审批层级、设置请假天数限制等。 总的来说,"简单的jbpm请假流程"涵盖了从流程设计、实现到运行的整个过程,它展示...

    jbpm document

    1. **jbpm简介**:介绍jbpm的基本概念、设计哲学和适用场景,帮助初学者建立对jbpm的初步认识。 2. **安装与配置**:详述如何在开发环境中设置jbpm,包括下载、构建、依赖管理和配置步骤。 3. **流程定义**:解释...

    JBPM5权威使用手册

    - **快速上手指南**:使用Eclipse、JBPM控制台或Guvnor进行初步尝试。 - **常见问题解答**:解决安装过程中可能遇到的问题。 #### 六、核心引擎API详解 - **jBPMAPI**:提供了操作知识库、会话和事件的基本接口。 -...

    JBPM学习视频15~17

    通过这三集视频的学习,观众将能深入理解JBPM 4.4的核心功能,并具备初步的流程设计和实施能力。对于希望提升企业流程管理水平,或对业务流程自动化感兴趣的开发者和管理人员来说,这是一份宝贵的学习资源。

    Jbpm HelloWorld

    "HelloWorld"是学习任何新技术时的经典入门示例,Jbpm HelloWorld则是对Jbpm基础功能的初步探索。 在这个项目中,我们将深入理解Jbpm的核心概念和组件,以及如何通过编写简单的代码来实现一个工作流实例。Jbpm的...

    Jboss-Jbpm-Getting-Started.pdf

    《JBoss jBPM入门与实践》 一、引言:深入理解JBoss jBPM JBoss jBPM(jBusiness Process Management)是JBoss家族中的一个开源工作流引擎,用于实现业务流程管理(BPM)解决方案。它提供了一套完整的工具集,包括...

    JBPM简析-part1

    本篇文章将对JBPM进行初步分析,着重探讨其核心概念、功能特性以及如何使用。 1. **核心概念** - **工作流(Workflow)**:工作流是一系列相互关联的任务,通过预定义的顺序进行协调,以完成一个业务过程。 - **...

    jbpm+spring的web简单借款工作流实例项目

    在本项目中,"FirstFlow"可能就是用BPMN设计的一个初步的借款申请流程。 接下来,我们关注Spring的角色。Spring作为基础架构层,将负责初始化jbPM环境,包括设置数据源、流程引擎、工作内存等。同时,Spring的依赖...

    bank.rar_jbpm_银行_银行工作流

    例如,当客户申请贷款时,系统会根据预设的工作流规则,自动将请求分发给相应的柜员进行初步审核,然后递交给信贷部门进行进一步评估,最后由风险控制部门决定是否批准贷款。整个过程无需人工干预,提高了效率,减少...

    jbmp用户指南.pdf

    完成以上步骤后,你的开发环境初步搭建完成,可以在新建的工程中创建Process Definition文件。 jBPM指南的第一章介绍了jBPM的基本概念,包括其灵活性、可扩展性,以及如何通过直观的流程设计语言来图形化表示业务...

Global site tag (gtag.js) - Google Analytics