zoukankan      html  css  js  c++  java
  • jbpm入门样例

    1.      jBPM的简介
    jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储。
       參考
    2.      jBPMmyeclipse的冲突
    当eclipse安装了myeclipsejBPM时候,可能有冲突,详细表如今jBPM的流程设计器不能在eclipse中使用。
     
    3.      Hibernate连接mysql数据库的一般參数
    以下的配置參数,依据须要能够改动:
    jbpmtestmysql中的schema的名字;
    GBK是字符集,能够依据须要改动;
    username=rootmysql数据库的用户名是root
    password=mysqlmysql数据库的用户密码是mysql
     
    hibernate.dialect=org.hibernate.dialect.MySQLDialect
    hibernate.connection.driver_class=com.mysql.jdbc.Driver
    hibernate.connection.url=jdbc:mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK
    hibernate.connection.username=root
    hibernate.connection.password=mysql
     
    hibernate.show_sql=true
    hibernate.c3p0.min_size=1
    hibernate.c3p0.max_size=3
     
    4.      Hibernate连接Oracle数据库的一般參数
    hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
    hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
    hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:orcl hibernate.connection.username=jbpm
    hibernate.connection.password=jbpm
     
    5.      jBPM创建数据库表等内容
    5.1.             mysql创建数据库以及数据内容
    JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().dropSchema();
    JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().createSchema();
    2个语针对mysq有效.
    5.2.             oralce创建数据库以及数据内容
    JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().dropSchema();
    JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().createSchema();
    上面的语句对oralce无效。
    模型文件夹jBPM/jbpm_database/jBPM_oralce10g.pdm 是jBPMOralce模型,包括相应的Sequence的信息.
    须要在数据库中创建 Sequence name=hibernate_sequence
    5.3.             流程信息保存到数据库
    JbpmSessionFactory  factory =  JbpmSessionFactory.buildJbpmSessionFactory();
            JbpmSession session = factory.openJbpmSession();
            GraphSession graphSession =  session.getGraphSession();
            session.beginTransaction();
            
            /// new ProcessDefinition 实例
            ProcessDefinition myProcessDefinition = null;
        ProcessInstance processInstance = new ProcessInstance(processDefinition);
          processInstance.getContextInstance().setVariable("myvar","xxx");
            ///
            graphSession.saveProcessDefinition(myProcessDefinition);
            session.commitTransaction();
    session.close();
    jBPMHibernate,MySQL的使用中会遇到字符集的问题.
    须要注意几个地方。
    5.4.             Mysql安装过程指定字符集
       Mysql安装过程中指定对应的默认字符集是GBK
    5.5.             Hibernate.properties文件里的字符集设置
    hibernate.connection.url=jdbc:mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK
    5.6.             hibernate.cfg.xml 文件里的字符集设置
    <property name="hibernate.connection.url">jdbc:mysql://192.168.1.2/jbpmtest</property>
    5.7.             MySQL的配置文件的改动:
       my.ini中 default-character-set=GBK
       注意有2处须要改动
     
    6.      为流程定义变量
    分成3种流程变量
    全局变量(全局流程变量)
    全局暂时变量(全局流程暂时变量)
    局部变量(流程某个接点内有效的变量)
    @see org.jbpm.context.exe.ContextInstance
    眼下还没有使用过局部变量(流程某个接点内有效的变量)
    流程变量的定义
    6.1.             流程变量的类型
    ·         java.lang.String
    ·         java.lang.Boolean
    ·         java.lang.Character
    ·         java.lang.Float
    ·         java.lang.Double
    ·         java.lang.Long
    ·         java.lang.Byte
    ·         java.lang.Short
    ·         java.lang.Integer
    ·         java.util.Date
    ·         byte[]
    ·         java.io.Serializable
    ·         classes that are persistable with hibernate
     全部基本类型的包裹类型,以及实现了Serializable的类型都能够作为流程參数变量使用,注意參数类不能是一个类的内部类或者属性类(除非包括參数类的类实现了Serializable接口)
    參考 org.jbpm.context.exe.VariableInstance
    6.2.             流程变量的使用
    l         变量的定义和获取
    void ContextInstance.setVariable(String variableName, Object value);
    void ContextInstance.setVariable(String variableName, Object value, Token token);
    Object ContextInstance.getVariable(String variableName);
    Object ContextInstance.getVariable(String variableName, Token token);
    l        Variables can be deleted with
    ContextInstance.deleteVariable(String variableName);
    ContextInstance.deleteVariable(String variableName, Token token);
     
    6.3.             Variable lifetime
       一个变量在被定义后,在变量从ContextInstance删除前,都能够被訪问。当变量被删除后,去获取该变量将返回为空。
    6.4.             自己定义类的实例作为流程变量
       假设一个类的实例要作为流程变量使用,该类须要实现java.io.Serializable接口,而且定义序列化版本号.
     
    //一个能够作为流程变量使用的类
    class Wdz implements Serializable{
        //为类指定序列化版本
        private static final long serialVersionUID = 1L;    
           private String name="wdz";
           private int age=10;
           public String toString(){
                  return "name="+name+",age="+age;    
           }    
    }
    上面的样例中,假设把类Wdz作为类WdzParent内部类使用,然后当成流程变量使用,那类WdzParent必须 也实现Serializable接口,否则会有问题.
    6.5.             Transient variables
    流程的历史变量是不能持久化的,作用范围是对整个流程全局有效的。
    ContextInstance类内部,採用的是一个Map来存储TransientVariable的信息
    參考代码
    org.jbpm.context.exe.ContextInstance 的源码。
    基本的相关方法
    public void deleteTransientVariable(java.lang.String name)
    public void setTransientVariable(java.lang.String name,
                                     java.lang.Object value)
    public java.lang.Object getTransientVariable(java.lang.String name)
     
    6.6.             Variables overloading
     当一个变量和流实例关联(变量名字=”wdz”,value=”test”),假设在设置一个变量
    (变量名字=”wdz”,value= new Integer(10)) ,那最后变量(变量名字=”wdz)的值是Integer(10)。
    这称之为overload.
     
    6.7.             Variables overriding
     假设父流程有变量A(值=”value1”),子流程又定义了变量A值=”value2”,那在子流程范围内,获取变量A的值,那结果是值=”value2”。这是遵循一般语言的局部变量在它的局部范围内override上级变量。
     
    6.8.             流程变量的持久化
    它依赖于流程实例的持久化,非TransientVariable流程实例的持久化一起被保存。
    保存在数据表jbpm_variableinstance
    參考 org.jbpm.context.exe.VariableInstance
    6.9.             Customizing variable persistence (能够进一步了解)
    User java object <---> converter <--->  variable instance
    也就是自己定义类的持久化须要定义自己的converter和变量实例类
    converter和变量实例类须要继承org.jbpm.context.exe.VariableInstance
    converter须要实现org.jbpm.context.exe.Converter接口

    工作流尽管还在不成熟的发展阶段,甚至还没有一个公认的规范标准。但其应用却已经在高速展开,这说明市场对工作流框架的需求是急迫而巨大的。

        我们公司的后台短信管理系统涉及短信编发、领导层层审核等操作,这是一个比較典型的工作流系统。过去我们用的工作流引擎是 shark ,然后在使用后发现其过于庞大,后台数据库操作频繁而未进行优化,直接导致的后果就是前台操作缓慢。于是经研究决定,将工作流引擎由 shark 换成 jBPM

        jBPM 之前是一个开源软件,后增加 JBoss 组织。正好我们公司也是用 JBoss 的。只是 jBPM 并没有绑定在 JBOSS 上, Tomcat 等也能够使用它。

        jBPM 的正处在不断发展中,做为开源软件的特点,其设计变化往往非常大。所以一些过去的资料可能已经不适用了。于是作者依据自己的使用经验,又一次整理出这份文档,以备学习參考。

    注:本文使用的 jBPM 版本号为 3.1.1

    环境准备

    1、安装JDK

    全部 JAVA 开发第一个须要安装的,没什么好说的。记得把系统变量 JAVA_HOME 设上。

    2、安装Ant

    Ant 是使用 jBPM 必须的一个工具。 jBPM 中的非常多操作都要用到 Ant

    安装方法:

    1 )先下载: http://archive.apache.org/dist/ant/binaries/ ,选一个如: apache-ant-1.6.5-bin.zip

    2 )解压到 D:/ant (当然其它文件夹也能够)。

    3 )设置例如以下系统变量: ANT_HOME=d:/ant

    4 )把 %ANT_HOME%/bin 增加到系统变量 PATH 中。

    3、安装Eclipse

    Eclipse 不是开发 jBPM 必须的工具,但它是对 jBPM 开发非常有帮助的工具,特别是 jBPM 提供了一个 Eclipse 插件用来辅助开发 jBPM 。关于 Eclipse 的安装不赘述了,本文用的版本号是: Eclipse3.2

     

    安装 jBPM

    jBPM 的下载地址: http://www.jboss.com/products/jbpm/downloads  

    l           JBoss jBPM jBPM 的软件包

    l           JBoss jBPM Starters Kit  是一个综合包,它包含了 jBPM 软件包、开发插件、一个配置好了的基于 JBoss jBPM 演示样例、一些数据库配置文件演示样例。

    l           JBoss jBPM Process Designer Plugin  是辅助开发 jBPM Eclipse 插件。

    l           JBoss jBPM BPEL Extension jBPM 关于 BPEL 的扩展包

    本指南选择下载: JBoss jBPM Starters Kit 。下载后解压到 D:/jbpm-starters-kit-3.1 ,文件夹下含有五个子文件夹:

    l           jbpm   jBPM 的软件包

    l           jbpm-bpel 仅仅含有一个网页

    l           jbpm-db 各种数据库 hibernate 配置文件演示样例,有些还包

  • 相关阅读:
    多项式大合集
    【题解】Codeforces 961G Partitions
    【题解】Counting D-sets(容斥+欧拉定理)
    【题解】分特产(组合数+容斥)
    【题解】P4247 [清华集训]序列操作(线段树修改DP)
    【题解】没有上司的舞会
    【题解】数字组合(NTT+组合 滑稽)
    【瞎总结】组合模型及其组合意义的阐释
    P2822 组合数问题——巧用前缀和
    P3239 [HNOI2015]亚瑟王——概率DP
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3784530.html
Copyright © 2011-2022 走看看