`
IT阿狸
  • 浏览: 67691 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JavaWeb Project 中使用JBPM,使用JUnit 4

阅读更多

JBPM

         JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。jBPM是公开源代码项目,使用它要遵循 ASL(Apache License Version 2.0)和EULA(JBoss End User License Agreement)协议。

 

 JBPM的运行需要数据库的支持,因此系统设计时要选定所用数据库。

 

这里使用Oracle作为数据库。使用JBPM的版本是 jbpm-jpdl-3.2.3。

 

一、建表空间,建用户

--创建表空间
CREATE TABLESPACE jbpm
DATAFILE 'E:\orcl_tblspace\jbpm.DBF'
SIZE 10M
AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED
LOGGING
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO; //以分号结束

--创建用户
CREATE USER jbpm
IDENTIFIED BY jbpm
DEFAULT TABLESPACE jbpm;

--把CONNECT、RESOURCE角色授予用户jbpm
GRANT CONNECT,RESOURCE TO jbpm

 

三、导入JBPM的表,在jbpm-jpdl-3.2.3/db下找到jbpm.jpdl.oracle,把他导入到新建的数据库用户中,先把该sql文件中的 drop table JBPM_ACTION cascade constraints; 之类语句先删掉。接着,数据库中会多了32张表。

 

 

二、建JavaWeb Project

1.在jbpm-jpdl-3.2.3/config中把如下4个文件复制到新建的JavaWeb Project中的src目录下。

a.hibernate.cfg

b.jbpm.cfg

c.jbpm.mail.templates

d.log4j.properties

 

2.把jbpm-jpdl-3.2.3/lib中的jar文件做成一个自定义的类库,然后导入到Java Project中。

 

3.导入Oracle的数据库驱动包。

 

4.修改hibernate.cfg配置文件中的dialect、driver_class、url、username和password。

 

5.顺便导入JUnit 4的类库,待会用作测试。

 

6.在JavaWeb Project中新建一工作流文件夹,例如workflow,用来存放流程图。

 

 

三、新建工作流文件(流程开始时带任务人)

1.

 

2.

 

3.

 

PS:gpd.xml文件可能会报错,不用管,编码问题而已,也不需要打开查看。

 

4.打开processdefinition.xml文件。开始画流程图

 

5.流程图的一些解释。


 

 

6.员工申请报销 流程的设置

Description那里写的是 staff.apply


 

 Assignment是指分派任务,Actor有可以指定作用域或者直接指定人名,例如Jack。

 

7.部门经理审批 的流程设置

Description那里写的是 manager.approve




 

 

这次的分配任务交给一个Java类来处理,选择Handler,这个类要实现AssignmentHandler这个接口。

 

8.财务审批 流程的设置



 

 

 这里也是直接指定财务人。

 

9.通知员工 的流程设置



 

 

 

这里的Actor所指定的角色必须要和 员工申请报销 流程里的Actor所指定的角色一样。

 

10.当设置好流程图的属性的时候,就可以开始部署了。



 

输入一个名字,然后按打开就行了。

 

接着,点击Save Without Deploying... 这个按钮,你就发现你所选择的目录里会多了一个.zip压缩包。

 

11.此时,需要一个Java类,把流程图的属性写入到数据库中

package org.jbpm.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipInputStream;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;

/**
 * 部署类
 * 
 * @author miao
 * 
 */
public class DelpoymentUtil {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 上下文
		JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
		// 该目录是画完流程图之后的部署位置
		String url = "C:\\Homework\\JaveSpace\\workStream\\leave.zip";
		try {
			// 输入流
			InputStream is = new FileInputStream(new File(url));
			// ZipInputStream是InputStream的子类,通过此类可以方便地读取ZIP格式的压缩文件
			ZipInputStream zis = new ZipInputStream(is);
			// 流程定义类
			ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zis);
			jbpmContext.deployProcessDefinition(pd);
			zis.close();
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jbpmContext.close();
		}
	}

}

 

运行这个类之后,会在数据库里的 JBPM_TASK 表和 JBPM_TASKINSTANCE 表发现数据。

 

四、编码

做个简单的申请报销处理类

package org.jbpm.process;

import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.def.AssignmentHandler;
import org.jbpm.taskmgmt.exe.Assignable;

/**
 * 报销类
 * 
 * @author miao
 * 
 */
public class ApplyProcess implements AssignmentHandler {

	public void assign(Assignable assignable, ExecutionContext context) throws Exception {
		// 该名字就是流程图里员工申请报销的那位,通过上下文获取
		String name = context.getContextInstance().getVariable("issueperson").toString();
		if ("user1".equals(name)) {
			assignable.setActorId("manager1");
		} else if ("user2".equals(name)) {
			assignable.setActorId("manager2");
		}
	}

}

 

 

五、测试类

package org.jbpm.test;

import java.util.List;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * 测试员工报销
 * 
 * @author miao
 * 
 */
public class TestApplyMoney {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@Test
	public void testProcess() {

		// 1.员工提交申请
		submitForm("user1");
		// 2.部门经理审核
		//managerApprove("manager1");
		// 3.财务拨款
		//cashierApprove("ali");
		// 4.员工领款
		//getMoney("user1");
	}

	/**
	 * 1.添加员工提交申请
	 * 
	 * @param actorId
	 */
	public void submitForm(String actorId) {
		JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
		try {
			ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition(
					"applyMoney");
			ProcessInstance pi = pd.createProcessInstance();
			ContextInstance ci = pi.getContextInstance();
			jbpmContext.setActorId(actorId);
			ci.setVariable("issueperson", actorId);
			TaskInstance ti = pi.getTaskMgmtInstance().createStartTaskInstance();
			ti.end();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jbpmContext.close();
		}
	}

	/**
	 * 2.部门经理审批
	 * 
	 * @param actorId
	 */
	public void managerApprove(String actorId) {
		JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
		try {
			@SuppressWarnings("unchecked")
			List<TaskInstance> list = jbpmContext.getTaskList(actorId);
			for (TaskInstance taskInstance : list) {
				taskInstance.end();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jbpmContext.close();
		}
	}

	/**
	 * 3.财务拨款
	 * 
	 * @param actorId
	 */
	public void cashierApprove(String actorId) {
		JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
		try {
			@SuppressWarnings("unchecked")
			List<TaskInstance> list = jbpmContext.getTaskList(actorId);
			for (TaskInstance taskInstance : list) {
				taskInstance.end();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jbpmContext.close();
		}
	}

	/**
	 * 4.员工领款
	 * 
	 * @param actorId
	 */
	public void getMoney(String actorId) {
		JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
		try {
			@SuppressWarnings("unchecked")
			List<TaskInstance> list = jbpmContext.getTaskList(actorId);
			for (TaskInstance taskInstance : list) {
				taskInstance.end();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			jbpmContext.close();
		}
	}

}

 

每测试一个方法,就会在数据库中的 JBPM_TASKINSTANCE 表看见相应的数据。

 

六、demo(该例子中也包含复杂一点的流程处理,带分支判断,流程开始时不带任务人)

E276-JBPM.zip

  • 大小: 29.4 KB
  • 大小: 21.6 KB
  • 大小: 5.8 KB
  • 大小: 53.2 KB
  • 大小: 14.4 KB
  • 大小: 20.3 KB
  • 大小: 23.7 KB
  • 大小: 22.4 KB
  • 大小: 24.1 KB
  • 大小: 29 KB
  • 大小: 35.6 KB
  • 大小: 23.6 KB
  • 大小: 28.4 KB
  • 大小: 26.6 KB
  • 大小: 23.5 KB
  • 大小: 26.6 KB
  • 大小: 27.2 KB
  • 大小: 25.6 KB
  • 大小: 41.2 KB
分享到:
评论

相关推荐

    超全面javaweb教程第7天- 04 junit的使用

    超全面javaweb教程第7天-_04_junit的使用

    jbpm5 web整合例子

    【jbpm5 web整合例子】是一个关于如何将JBPM5工作流引擎与Web应用程序整合的实践项目,适合那些想要在Web环境中使用业务流程管理(BPM)功能的开发者。JBPM5是一个开源的工作流和业务规则管理系统,它提供了一整套...

    在Eclipse中使用JUnit4进行单元测试(转)

    在Eclipse中使用JUnit4进行单元测试是一种常见的开发实践,它可以帮助程序员确保代码的质量和可靠性。JUnit4是Java编程语言中最流行的单元测试框架之一,它提供了丰富的注解、断言和测试工具,使得测试过程更加简洁...

    jBPM4.4请假流程JavaWeb完全版

    4. **jBPM API使用** - **流程部署**: 使用`org.jbpm.process.api.DeploymentService`部署流程定义文件(.bpmn或.xml)。 - **流程实例创建**: 调用`org.jbpm.runtime.manager.RuntimeEngine`的`startProcess()`...

    javaweb中.java文件测试需要的框架(junit测试).rar

    本压缩包文件"javaweb中.java文件测试需要的框架(junit测试).rar"显然是为了帮助开发者理解如何在Java Web项目中使用JUnit进行测试。 **JUnit框架详解** JUnit是一个基于注解的测试框架,它的核心功能包括: 1....

    酒店管理系统(Javaweb project).zip

    技术栈概览:涵盖了Spring、SpringMVC、MyBatis等主流JavaWeb框架的使用,以及MySQL数据库的管理。 项目模块解析:按照实际项目结构,分模块介绍了后台管理、用户权限管理、数据报表生成等功能的具体实现。 代码与...

    管理系统系列--酒店管理系统(Javaweb project).zip

    【标题】:“管理系统系列--酒店管理系统(Javaweb project)”是一个基于JavaWeb技术的项目,旨在实现一套全面的酒店业务流程管理解决方案。这个项目可能涵盖了从预订、入住、退房到财务管理等多个功能模块,旨在...

    javaweb project api

    在"javaweb project api"中,我们主要会关注以下几个核心概念和技术: 1. **Servlet**:Servlet是JavaWeb应用中的核心组件,用于处理HTTP请求并生成响应。它们扩展了Web服务器的功能,可以动态生成网页内容。...

    设备维修管理系统源码+项目说明(JavaWeb 项目,使用原生servlet 和 JDBC).zip

    设备维修管理系统源码+项目说明(JavaWeb 项目,使用原生servlet 和 JDBC).zip设备维修管理系统源码+项目说明(JavaWeb 项目,使用原生servlet 和 JDBC).zip设备维修管理系统源码+项目说明(JavaWeb 项目,使用...

    尚硅谷全新JavaWeb教程,企业主流javaweb技术栈 中代码

    尚硅谷推出的全新JavaWeb教程聚焦于企业主流技术栈,旨在帮助开发者掌握实际工作中所需的关键技能。本教程涵盖了Tomcat服务器、Servlet等核心组件的使用,并在IntelliJ IDEA(一款强大的Java开发集成环境)上进行...

    javaweb 问答系统使用 redis + jsp + mysql

    javaweb 问答系统使用 redis + jsp + mysql。 javaweb问答系统使用redis+jsp+mysql,可以发帖,回帖,点赞,,登录注册,查看浏览数,前端与后台,权限访问,附带数据库文件 jsp redis mysql

    Javaweb开发中的常用基础jar.zip

    在JavaWeb开发中,常用的库和框架是项目构建的基础,它们极大地简化了开发工作并提高了效率。本压缩包“Javaweb开发中的常用基础jar.zip”汇集了开发者在学习和实践中经常需要用到的jar文件,旨在帮助初学者快速搭建...

    发布一个简单的javaweb工程(使用eclipse自带发布功能)

    4. **创建JavaWeb工程**: 首先,你需要在Eclipse中创建一个新的Dynamic Web Project。在“File”菜单中选择“New” -&gt; “Dynamic Web Project”,输入项目名称,然后配置项目属性,如Web目录(WEB-INF)、目标运行时...

    mylib_javaweb(hibernate、struts、mysql_jdbc、junit等包)

    在"mylib_javaweb"这个压缩包中,包含了几个核心的JavaWeb开发框架和库,如Hibernate、Struts、MySQL JDBC驱动以及JUnit。这些组件在实际开发中扮演着至关重要的角色,下面我们来逐一探讨。 首先,Hibernate是一个...

    javaweb项目实训

    2. `test`:测试目录,存放单元测试代码,通常使用JUnit框架进行测试。 3. `dist`:发布目录,存放最终的可部署应用,如WAR(Web Application Archive)文件。 4. `src`:源代码目录,包含Java类和JSP文件。 5. `...

    Javaweb myeclipse基本使用教程

    在"myeclipse基本使用"这个文件中,很可能是详细讲述了以上的一些基本操作和流程,包括创建项目、编写代码、部署应用、数据库操作以及使用框架等。"MyEclipse_6使用教程.pdf"可能会更深入地介绍MyEclipse 6版本的...

    教材源码_javaweb_黑马程序员Javaweb源码_

    JavaWeb是Java编程领域中的一个重要组成部分,主要涉及Web应用程序的开发和实现。黑马程序员是一家知名的IT教育机构,他们提供的Javaweb教材源码是为了帮助学员深入理解和实践Web开发技术。下面将详细介绍JavaWeb的...

    javaWeb中使用Excel模板导出业务数据

    在javaWeb开发中,会经常遇到导出业务数据的业务需求,导出Excel最常用的技术就是poi,对于简单的业务,我们可以动态的生成一个Excel文件,但对于复杂的业务,我们可以通过使用读取Excel模板的,然后往里面填充数据...

    使用Maven构建JavaWeb项目实例

    在JavaWeb开发中,Maven是一个非常重要的工具,它提供了项目构建、依赖管理和标准化的生命周期。本实例将详细讲解如何使用Maven构建一个完整的JavaWeb项目。以下将围绕Maven的配置、依赖管理、插件使用以及JavaWeb...

Global site tag (gtag.js) - Google Analytics