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(该例子中也包含复杂一点的流程处理,带分支判断,流程开始时不带任务人)
相关推荐
超全面javaweb教程第7天-_04_junit的使用
【jbpm5 web整合例子】是一个关于如何将JBPM5工作流引擎与Web应用程序整合的实践项目,适合那些想要在Web环境中使用业务流程管理(BPM)功能的开发者。JBPM5是一个开源的工作流和业务规则管理系统,它提供了一整套...
在Eclipse中使用JUnit4进行单元测试是一种常见的开发实践,它可以帮助程序员确保代码的质量和可靠性。JUnit4是Java编程语言中最流行的单元测试框架之一,它提供了丰富的注解、断言和测试工具,使得测试过程更加简洁...
4. **jBPM API使用** - **流程部署**: 使用`org.jbpm.process.api.DeploymentService`部署流程定义文件(.bpmn或.xml)。 - **流程实例创建**: 调用`org.jbpm.runtime.manager.RuntimeEngine`的`startProcess()`...
本压缩包文件"javaweb中.java文件测试需要的框架(junit测试).rar"显然是为了帮助开发者理解如何在Java Web项目中使用JUnit进行测试。 **JUnit框架详解** JUnit是一个基于注解的测试框架,它的核心功能包括: 1....
技术栈概览:涵盖了Spring、SpringMVC、MyBatis等主流JavaWeb框架的使用,以及MySQL数据库的管理。 项目模块解析:按照实际项目结构,分模块介绍了后台管理、用户权限管理、数据报表生成等功能的具体实现。 代码与...
【标题】:“管理系统系列--酒店管理系统(Javaweb project)”是一个基于JavaWeb技术的项目,旨在实现一套全面的酒店业务流程管理解决方案。这个项目可能涵盖了从预订、入住、退房到财务管理等多个功能模块,旨在...
在"javaweb project api"中,我们主要会关注以下几个核心概念和技术: 1. **Servlet**:Servlet是JavaWeb应用中的核心组件,用于处理HTTP请求并生成响应。它们扩展了Web服务器的功能,可以动态生成网页内容。...
设备维修管理系统源码+项目说明(JavaWeb 项目,使用原生servlet 和 JDBC).zip设备维修管理系统源码+项目说明(JavaWeb 项目,使用原生servlet 和 JDBC).zip设备维修管理系统源码+项目说明(JavaWeb 项目,使用...
尚硅谷推出的全新JavaWeb教程聚焦于企业主流技术栈,旨在帮助开发者掌握实际工作中所需的关键技能。本教程涵盖了Tomcat服务器、Servlet等核心组件的使用,并在IntelliJ IDEA(一款强大的Java开发集成环境)上进行...
javaweb 问答系统使用 redis + jsp + mysql。 javaweb问答系统使用redis+jsp+mysql,可以发帖,回帖,点赞,,登录注册,查看浏览数,前端与后台,权限访问,附带数据库文件 jsp redis mysql
在JavaWeb开发中,常用的库和框架是项目构建的基础,它们极大地简化了开发工作并提高了效率。本压缩包“Javaweb开发中的常用基础jar.zip”汇集了开发者在学习和实践中经常需要用到的jar文件,旨在帮助初学者快速搭建...
4. **创建JavaWeb工程**: 首先,你需要在Eclipse中创建一个新的Dynamic Web Project。在“File”菜单中选择“New” -> “Dynamic Web Project”,输入项目名称,然后配置项目属性,如Web目录(WEB-INF)、目标运行时...
在"mylib_javaweb"这个压缩包中,包含了几个核心的JavaWeb开发框架和库,如Hibernate、Struts、MySQL JDBC驱动以及JUnit。这些组件在实际开发中扮演着至关重要的角色,下面我们来逐一探讨。 首先,Hibernate是一个...
2. `test`:测试目录,存放单元测试代码,通常使用JUnit框架进行测试。 3. `dist`:发布目录,存放最终的可部署应用,如WAR(Web Application Archive)文件。 4. `src`:源代码目录,包含Java类和JSP文件。 5. `...
在"myeclipse基本使用"这个文件中,很可能是详细讲述了以上的一些基本操作和流程,包括创建项目、编写代码、部署应用、数据库操作以及使用框架等。"MyEclipse_6使用教程.pdf"可能会更深入地介绍MyEclipse 6版本的...
JavaWeb是Java编程领域中的一个重要组成部分,主要涉及Web应用程序的开发和实现。黑马程序员是一家知名的IT教育机构,他们提供的Javaweb教材源码是为了帮助学员深入理解和实践Web开发技术。下面将详细介绍JavaWeb的...
在javaWeb开发中,会经常遇到导出业务数据的业务需求,导出Excel最常用的技术就是poi,对于简单的业务,我们可以动态的生成一个Excel文件,但对于复杂的业务,我们可以通过使用读取Excel模板的,然后往里面填充数据...
在JavaWeb开发中,Maven是一个非常重要的工具,它提供了项目构建、依赖管理和标准化的生命周期。本实例将详细讲解如何使用Maven构建一个完整的JavaWeb项目。以下将围绕Maven的配置、依赖管理、插件使用以及JavaWeb...