• 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.4installsrcgpd

     

    2.3选择插件

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

    1.配置运行时的环境

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

     

     

    1.配置JPDL xmlschema 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的解压包中根目录Jbpmjar包还有lib文件夹中除report-enginewar包外所有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()+"	任务名称:"+task.getName()+"	任务的办理人:"+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()+"	name:"+pd.getName()+"	key"+pd.getKey()+"	版本号:"+pd.getVersion()+"	部署的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()+"	name:"+pd.getName()+"	key"+pd.getKey()+"	版本号:"+pd.getVersion()+"	部署的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);
    
    }

    五.JBPMSSH整合

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

    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>
  • 相关阅读:
    phpcms中常用代码总结
    jQuery学习:用按键移动方块
    <item.../>元素可指定如下常用属性
    Microsoft.Office.Interop.Excel的用法
    科技与健康
    计算机系统的分类
    Android中的一些小知识
    android项目中各个文件的介绍
    Activity和Servlet的相似之处和区别
    在Activity的生命周期中,会被系统回调的方法
  • 原文地址:https://www.cnblogs.com/jingpeipei/p/6150409.html
Copyright © 2020-2023  润新知