Java開源工作流(workflow)---JBPM學習心得總結

火星人 @ 2014-03-10 , reply:0


  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介面





[火星人 via ] Java開源工作流(workflow)---JBPM學習心得總結已經有353次圍觀

http://www.coctec.com/docs/java/show-post-61617.html