技术开发 频道

java开源工作流(workflow)---jBPM学习心得总结

  【IT168技术文档1. jBPM的简单介绍

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

  参考

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

  2. jBPM和myeclipse的冲突

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

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

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

  jbpmtest是mysql中的schema的名字;

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

  username=root,mysql数据库的用户名是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= jdbcracle:thin:@localhost:1521rcl 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_oralce10g.pdm 是jBPM的Oralce模型,包含对应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();

  jBPM和Hibernate,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 文件中的字符集设置

  jdbc:mysql://192.168.1.2/jbpmtest

  5.7. MySQL的配置文件的修改:

  my.ini中 default-character-set=GBK

  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. 流程变量的使用

  ? 变量的定义和获取

  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);

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

0
相关文章