元傲一 / 工作流 / jbpm学习心得

分享

   

jbpm学习心得

2006-08-28  元傲一

jBPM的学习心得

1.      jBPM的简单介绍

jBPMJBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储。

   参考

http://www.jboss.com/products/jbpm

2.      jBPMmyeclipse的冲突

eclipse安装了myeclipsejBPM时候,可能有冲突,具体表现在jBPM的流程设计器不能在eclipse中使用。

 

3.      Hibernate连接mysql数据库的一般参数

下面的配置参数,根据需要可以修改:

jbpmtestmysql中的schema的名字;

GBK是字符集,可以根据需要修改;

username=rootmysql数据库的用户名是root

password=mysql mysql数据库的用户密码是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

http://wiki.jboss.org/wiki/Wiki.jsp?page=JbpmOnOracle

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接口

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>