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接口
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章