JBPM工作流
一.开发环境的搭建
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工作流的更多相关文章
- JBPM工作流入门总结
关于JBPM工作流 1.工作流 工作流是一项分离业务操作和系统流程的技术.工作流由实体(Entity).参与者(Participant).流程定义(Flow Definition).工作流引擎(Eng ...
- 转发 JBPM工作流小结
JBoss 题记:某部门领导有天突发奇想,把我们几个人叫过去,曰:最近出去开会,老有人推销自己的工作流产品,说的这好那好,你们几个给我研究研究.正好刚做完的xxx子系统里有一个申请审批的流程,你们按这 ...
- Jbpm工作流(一)
了解一下什么是Jbpm及特点. jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统.jBPM是公开源代码项目,它使用要遵循 Ap ...
- JBPM——工作流概念
一.概念 工作流(Workflow),就是"业务过程的部分或总体在计算机应用环境下的自己主动化",它主要解决的是"使在多个參与者之间依照某种提前定义的规 ...
- jbpm 工作流(二)
1 概述 本文主要介绍如何将JBPM+Struts+Spring+Hibernate整合在一块.并通过一个简单实例来说明.此实例为一个申请审批的简单流程,并将申请人和审批人记录到数 ...
- JBPM工作流(一)——实现一个简单的工作流例子
一.JBPM定义 JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可执行流 ...
- python调用Java代码,完毕JBPM工作流application
1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...
- 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】
一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...
随机推荐
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(18)-权限管理系统-表数据
系列目录 这一节,我们插入数据来看看数据流,让各位同学,知道这个权限表交互是怎么一个流程,免得大家后天雾里来雾里去首先我再解释一些表,SysUser和SysRole表不用解释了. SysRoleSys ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- linux内核调试技术之修改内核定时器来定位系统僵死问题
1.简介 在内核调试中,会经常出现内核僵死的问题,也就是发生死循环,内核不能产生调度.导致内核失去响应.这种情况下我们可以采用修改系统内核中的系统时钟的中断来定位发生僵死的进程和函数名称.因为内核系统 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习
对于一个有登录限制(权限限制)的网站,用户输入身份验证信息以后,验证成功后跳转到登录前的页面是一项很人性化的功能.那么获取登录前的页面地址就很关键,今天在做一个yii2项目的登录调试时发现了一些很有意 ...
- 【分布式】Zookeeper应用场景
一.前言 在上一篇博客已经介绍了Zookeeper开源客户端的简单实用,本篇讲解Zookeeper的应用场景. 二.典型应用场景 Zookeeper是一个高可用的分布式数据管理和协调框架,并且能够很好 ...
- Linux 系统命令笔记
前言 翻出N年前学习笔记,感觉还有点用,放到博客备忘,自己查看用. 一. 系统命令笔记 1.系统 % /etc/issue # 查看操作系统版本 % # 观察系 ...
- 利用Python进行数据分析(9) pandas基础: 汇总统计和计算
pandas 对象拥有一些常用的数学和统计方法. 例如,sum() 方法,进行列小计: sum() 方法传入 axis=1 指定为横向汇总,即行小计: idxmax() 获取最大值对应的索 ...
- React Native组件介绍
1.React Native目前已有的组件 ActivityIndicatorIOS:标准的旋转进度轮; DatePickerIOS:日期选择器: Image:图片控件: ListView:列表控件: ...
- 『.NET Core CLI工具文档』(十一)dotnet-test
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-test 翻译:dotnet-test 名称 dotnet-test - 使用配置的测试运行器运行单元测试 ...