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>