一.开发环境的搭建

1.下载Jbpm4.4

1.1下载地址:

https://sourceforge.net/projects/jbpm/files/jBPM%204/jbpm-4.4/

1.2解压后的目录

2.安装GPD插件(eclipse图形化流程设计器)

2.1打开eclipse--------选择help--------选择install new software

2.2选择add添加插件:

点击Archive选择插件目录:

插件目录所在位置就是下载的解压后的路径中找jbpm-4.4\install\src\gpd

2.3选择插件

后续直接下一步就行,等待安装插件。

1.配置运行时的环境

打开eclipse-------------preference

1.配置JPDL xml的schema dtd

4.1目的

有时在建jpdlxml文件的时候没有节点的提示,我们配置一下这个schema dtd,就有提示了。

4.2配置步骤

打开eclipse-------------preference

二.JBPM简介

2.1什么是jbpm

JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。

2.2为什么用jbpm

业务分析师和开发人员使用的是同一种语言来交谈,大大降低了开发的风险,如果要开发一个项目,速度也更快了,因为开发人员不用再将用户需求转化成软件设计了。其次,JBPM采用的不是一般的开发工具,而是自己的图形化开发工具,非常方便随时了解和掌握运行的进程。最后,JBPM的流程框架非常灵活,使用起来也非常安全,它经过了安全认证,因此可以保证一些商业机密不被泄露。

.开发步骤

1.引入jar包

在jbpm4.4的解压包中根目录Jbpm的jar包还有lib文件夹中除report-engine,war包外所有jar包

注:因为Jbpm4.4是用Mysql作为DB的,如果要用Oracle作为DB需要引入相应的驱动包。

2.创建配置文件

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

<!DOCTYPE hibernate-configuration PUBLIC

          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

  <session-factory>

      <!-- 连接数据库的一些信息 -->

     <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

     <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

     <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

     <property name="hibernate.connection.username">jbpm</property>

     <property name="hibernate.connection.password">jbpm</property>

     <property name="hibernate.hbm2ddl.auto">update</property>

     <property name="hibernate.format_sql">true</property>

     <!-- 小配置:映射文件 -->

     <mapping resource="jbpm.repository.hbm.xml" />

     <mapping resource="jbpm.execution.hbm.xml" />

     <mapping resource="jbpm.history.hbm.xml" />

     <mapping resource="jbpm.task.hbm.xml" />

     <mapping resource="jbpm.identity.hbm.xml" />

  </session-factory>

</hibernate-configuration>

3.画流程图

新建jpdl.xml文件

4.创建表结构

 /**

 * 创建表结构:有18张表

 */

@Test

public void createTable(){

  // 读取配置文件  

  new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();

}

18张表的含义:

http://www.cnblogs.com/a757956132/p/4774188.html

5.获取工作流引擎

//获取工作流引擎

//ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();

//获取工作流引擎

ProcessEngine processEngine =Configuration.getProcessEngine();

6.部署流程定义

//获取工作流引擎

//ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();

//获取工作流引擎

ProcessEngine processEngine =Configuration.getProcessEngine();

7.启动流程实例

//获取工作流引擎

//ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();

//获取工作流引擎

ProcessEngine processEngine =Configuration.getProcessEngine();

8.查询任务

 @Test

public void selectMyStack(){

//根据指定的人员去查看他的任务

List<Task> stacks= processEngine.getTaskService().findPersonalTasks("部门经理");

System.out.println("经理的任务");

for (Task task : stacks) {

System.out.println("任务ID:"+task.getId()+"\t任务名称:"+task.getName()+"\t任务的办理人:"+task.getAssignee());

}

}

9.查询当前任务所在节点

@Test

public void getActivity(){

String name=processEngine.getExecutionService().createProcessInstanceQuery().processInstanceId("jbpm01.10001").uniqueResult().findActiveActivityNames().toString();

System.out.println("当前任务所在节点:"+name);

}

10.办理任务

@Test

public void saveTask(){

processEngine.getTaskService().completeTask("80002");

System.out.println("任务办理成功");

}

四.流程管理

4.1部署流程

4.2查看所有流程定义的信息

@Test

public void findAll(){

List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery().list();

for (ProcessDefinition pd : list) {

/**

 * id的格式  name-版本号

 * name:jbpm.cfg.xml文件中根据点的name属性值

 * key,如果在配置文件中指定了,那么就是根据点中的test的 值,如果不指定默认是name的值

 * version版本号,同一个名称的第一个为1后续的自增

 */

System.out.println("id:"+pd.getId()+"\tname:"+pd.getName()+"\tkey"+pd.getKey()+"\t版本号:"+pd.getVersion()+"\t部署的id:"+pd.getDeploymentId());

}

}

4.3删除指定id流程信息

@Test

public void deleteByid(){

pe.getRepositoryService().deleteDeploymentCascade("100001");

System.out.println("删除成功");

}

4.4删除指定key的所有流程信息

 @Test

public void deleteByids(){

//01.取出当前key对应的版本信息

List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("jbpmtest").list();

for (ProcessDefinition pd : list) {

  pe.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());

}

System.out.println("删除成功");

}

4.5获取流程图

@Test

public void getImage() throws Exception{

String deploymentId="10001";

String resouceName="jbpmtest.png";

//根据id去查询所有对应的资源名

Set<String> resourceNames = pe.getRepositoryService().getResourceNames(deploymentId);

for(String item: resourceNames){

System.out.println("资源名称:"+item);

}

InputStream in=pe.getRepositoryService().getResourceAsStream(deploymentId, resouceName);

OutputStream os=new FileOutputStream("D:\\1.png");

int a=in.read();

while (a!=-1) {

os.write(a);

a=in.read();

}

    in.close();

    os.close();

    System.out.println("成功");

}

4.6部署zip格式的资源

public void addZipResource(){

InputStream is=this.getClass().getClassLoader().getResourceAsStream("two.zip");

ZipInputStream zs=new ZipInputStream(is);

String id= pe.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy();

  System.out.println("部署成功:deploymentid:"+id);

}

4.7找到所有最新版本的流程定义

@Test

public void findNewVersionInfo(){

//查询所有

List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery()//

.orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)

.list();

Map<String,ProcessDefinition> map=new java.util.HashMap<String,ProcessDefinition>();

for (ProcessDefinition item : list) {

map.put(item.getKey(),item);

}

for (ProcessDefinition pd : map.values()) {

System.out.println("id:"+pd.getId()+"\tname:"+pd.getName()+"\tkey"+pd.getKey()+"\t版本号:"+pd.getVersion()+"\t部署的id:"+pd.getDeploymentId());

}

}

4.8设置流程变量

public void setVariable() {

pe.getExecutionService().setVariable("jbpm01.90001", "请假天数", 18);

}

@Test

public void getVariable() {

Integer days = (Integer) pe.getExecutionService().getVariable("jbpm01.90001", "请假天数");

System.out.println(days);

}

五.JBPM和SSH整合

目的:整合jBPM的目的就是能够通过注入的方式得到ProcessEngine实例,因为ProcessEngine是jbpm 的核心.

1.关于jar包

在Tomcat/lib目录下添加jBPM软件包里的下列三个jar包,删掉Tomact/lib下的el-api

2.关于配置文件

修改jbpm.cfg.xml文件

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

<jbpm-configuration>

  <import resource="jbpm.default.cfg.xml" />

  <import resource="jbpm.businesscalendar.cfg.xml" />

  <!-- Hibernate的事务管理器 -->

  <!-- <import resource="jbpm.tx.hibernate.cfg.xml" /> -->

  <!-- 修改为Spring的事务管理器 -->

  <import resource="jbpm.tx.spring.cfg.xml" />

  <import resource="jbpm.jpdl.cfg.xml" />

  <import resource="jbpm.bpmn.cfg.xml" />

  <import resource="jbpm.identity.cfg.xml" />

  <!-- Job executor is excluded for running the example test cases. -->

  <!-- To enable timers and messages in production use, this should be included. -->

  <!--

  <import resource="jbpm.jobexecutor.cfg.xml" />

  -->

</jbpm-configuration>

修改applicationcontext.xml文件

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

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/tx

       http://www.springframework.org/schema/tx/spring-tx.xsd

       http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop.xsd

       http://www.springframework.org/schema/context

       http://www.springframework.org/schema/context/spring-context.xsd

        ">

<!-- 扫描包中注解标注的类 -->

<context:component-scan base-package="cn"></context:component-scan>

<!-- 1.引入jdbc.properties文件 -->

<bean id="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="location">

<value>classpath:jdbc.properties</value>

</property>

</bean>

<!-- 2.配置dataSource c3p0数据源 -->

<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

<!-- 数据库连接信息 -->

<property name="jdbcUrl" value="${jdbc.url}"></property>

<property name="driverClass" value="${jdbc.driver}"></property>

<property name="user" value="${jdbc.username}"></property>

<property name="password" value="${jdbc.password}"></property>

<!-- 其他配置 -->

<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->

<property name="initialPoolSize" value="3"></property>

<!--连接池中保留的最小连接数。Default: 3 -->

<property name="minPoolSize" value="3"></property>

<!--连接池中保留的最大连接数。Default: 15 -->

<property name="maxPoolSize" value="5"></property>

<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->

<property name="acquireIncrement" value="3"></property>

<!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:

0 -->

<property name="maxStatements" value="8"></property>

<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->

<property name="maxStatementsPerConnection" value="5"></property>

<!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->

<property name="maxIdleTime" value="1800"></property>

</bean>

<!-- 3.定义sessionFactory -->

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<!-- 3.1为LocalSessionFactoryBean注入定义好的数据源 -->

<property name="dataSource">

<ref bean="datasource" />

</property>

<!--3.2添加hibernate配置参数 -->

<!--添加hibernate配置参数 -->

<property name="hibernateProperties">

<props>

<!-- 每个数据库都有其对应的Dialect以匹配其平台特性 -->

<prop key="hibernate.dialect">

org.hibernate.dialect.Oracle10gDialect

</prop>

<!-- 是否将运行期生成的sql输出到日志以供调试 -->

<prop key="hibernate.show_sql">

true

</prop>

<!-- 是否格式化sql -->

<prop key="hibernate.format_sql">

true

</prop>

<prop key="hibernate.hbm2ddl.auto">

update

</prop>

<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext

</prop>

</props>

</property>

<!-- 指定资源文件 -->

<property name="mappingResources">

<list>

<value>jbpm.repository.hbm.xml</value>

<value>jbpm.execution.hbm.xml</value>

<value>jbpm.history.hbm.xml</value>

<value>jbpm.task.hbm.xml</value>

<value>jbpm.identity.hbm.xml</value>

</list>

</property>

</bean>

<!-- 配置 ProcessEngine对象 -->

<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">

<property name="jbpmCfg" value="jbpm.cfg.xml"></property>

</bean>

<bean id="processEngine" factory-bean="springHelper"

factory-method="createProcessEngine" />

<!-- 定义事务管理器 -->

<bean id="txManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"></property>

</bean>

<tx:annotation-driven transaction-manager="txManager" />

</beans>

JBPM工作流的更多相关文章

  1. JBPM工作流入门总结

    关于JBPM工作流 1.工作流 工作流是一项分离业务操作和系统流程的技术.工作流由实体(Entity).参与者(Participant).流程定义(Flow Definition).工作流引擎(Eng ...

  2. 转发 JBPM工作流小结

    JBoss 题记:某部门领导有天突发奇想,把我们几个人叫过去,曰:最近出去开会,老有人推销自己的工作流产品,说的这好那好,你们几个给我研究研究.正好刚做完的xxx子系统里有一个申请审批的流程,你们按这 ...

  3. Jbpm工作流(一)

    了解一下什么是Jbpm及特点. jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统.jBPM是公开源代码项目,它使用要遵循 Ap ...

  4. JBPM——工作流概念

    一.概念          工作流(Workflow),就是"业务过程的部分或总体在计算机应用环境下的自己主动化",它主要解决的是"使在多个參与者之间依照某种提前定义的规 ...

  5. jbpm 工作流(二)

    1           概述 本文主要介绍如何将JBPM+Struts+Spring+Hibernate整合在一块.并通过一个简单实例来说明.此实例为一个申请审批的简单流程,并将申请人和审批人记录到数 ...

  6. JBPM工作流(一)——实现一个简单的工作流例子

    一.JBPM定义 JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可执行流 ...

  7. python调用Java代码,完毕JBPM工作流application

    1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...

  8. 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】

    一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...

  9. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

随机推荐

  1. 爬虫技术 -- 进阶学习(十)网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)

    最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/Scrapy ...

  2. 计算机程序的思维逻辑 (50) - 剖析EnumMap

    上节我们提到,如果需要一个Map的实现类,并且键的类型为枚举类型,可以使用HashMap,但应该使用一个专门的实现类EnumMap. 为什么要有一个专门的类呢?我们之前介绍过枚举的本质,主要是因为枚举 ...

  3. 多线程同步工具——volatile变量

    关于volatile,找了一堆资料看,看完后想找一个方法去做测试,测了很久,感觉跟没有一样. 这本书<深入理解Java内存模型>,对volatile描述中有这样一个比喻的说法,如下代码所示 ...

  4. ASP.NET(IIS)出现"没有为请求类型"GET"找到 HTTP 处理程序"

    pasting 环       境:windows 2003 IIS6.0 程序支持:ASP.NET .NET版本:2.0.4.0 问    题:之前服务器上各大网站运行良好,今天突然出现:" ...

  5. [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)

    [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date  周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...

  6. 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能

    Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...

  7. doT js 模板引擎【初探】要优雅不要污

    js中拼接html,总是感觉不够优雅,本着要优雅不要污,决定尝试js模板引擎. JavaScript 模板引擎 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注. ...

  8. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  9. DSP的Gel作用

    转自:http://blog.csdn.net/azhgul/article/details/6660960 最近刚在研究Davinci系,特此MARK下,以资后续学习之用. DSP的Gel作用 1 ...

  10. HTML5 Canvas绘制转盘抽奖

    新项目:完整的Canvas转盘抽奖代码 https://github.com/givebest/GB-canvas-turntable 演示 http://blog.givebest.cn/GB-ca ...