jBPM的學(xué)習(xí)心得 1. jBPM的簡(jiǎn)單介紹jBPM是JBOSS下的一個(gè)開源java工作流項(xiàng)目,該項(xiàng)目提供eclipse插件,基于Hibernate實(shí)現(xiàn)數(shù)據(jù)持久化存儲(chǔ)。 參考 2. jBPM和myeclipse的沖突當(dāng)eclipse安裝了myeclipse和jBPM時(shí)候,可能有沖突,具體表現(xiàn)在jBPM的流程設(shè)計(jì)器不能在eclipse中使用。 3. Hibernate連接mysql數(shù)據(jù)庫(kù)的一般參數(shù)下面的配置參數(shù),根據(jù)需要可以修改: jbpmtest是mysql中的schema的名字; GBK是字符集,可以根據(jù)需要修改; username=root,mysql數(shù)據(jù)庫(kù)的用戶名是root; password=mysql ,mysql數(shù)據(jù)庫(kù)的用戶密碼是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數(shù)據(jù)庫(kù)的一般參數(shù)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創(chuàng)建數(shù)據(jù)庫(kù)表等內(nèi)容5.1. 為mysql創(chuàng)建數(shù)據(jù)庫(kù)以及數(shù)據(jù)內(nèi)容JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().dropSchema(); JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().createSchema(); 這2個(gè)語(yǔ)針對(duì)mysq有效. 5.2. 為oralce創(chuàng)建數(shù)據(jù)庫(kù)以及數(shù)據(jù)內(nèi)容JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().dropSchema(); JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().createSchema(); 上面的語(yǔ)句對(duì)oralce無(wú)效。 模型目錄jBPM\jbpm_database\jBPM_oralce 需要在數(shù)據(jù)庫(kù)中創(chuàng)建 Sequence name=hibernate_sequence http://wiki./wiki/Wiki.jsp?page=JbpmOnOracle 5.3. 流程信息保存到數(shù)據(jù)庫(kù)JbpmSessionFactory factory = JbpmSessionFactory.buildJbpmSessionFactory(); JbpmSession session = factory.openJbpmSession(); GraphSession graphSession = session.getGraphSession(); session.beginTransaction();
/// new ProcessDefinition 實(shí)例 ProcessDefinition myProcessDefinition = null; ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.getContextInstance().setVariable("myvar","xxx"); /// graphSession.saveProcessDefinition(myProcessDefinition); session.commitTransaction(); session.close(); jBPM和Hibernate,MySQL的使用中會(huì)遇到字符集的問(wèn)題. 需要注意幾個(gè)地方。 5.4. 在Mysql安裝過(guò)程指定字符集在Mysql安裝過(guò)程中指定相應(yīng)的默認(rèn)字符集是GBK 5.5. Hibernate.properties文件中的字符集設(shè)置hibernate.connection.url=jdbc:mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK 5.6. hibernate.cfg.xml 文件中的字符集設(shè)置<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種流程變量 全局變量(全局流程變量) 全局臨時(shí)變量(全局流程臨時(shí)變量) 局部變量(流程某個(gè)接點(diǎn)內(nèi)有效的變量) @see org.jbpm.context.exe.ContextInstance 目前還沒有使用過(guò)局部變量(流程某個(gè)接點(diǎn)內(nèi)有效的變量) 流程變量的定義 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 所有基本類型的包裹類型,以及實(shí)現(xiàn)了Serializable的類型都可以作為流程參數(shù)變量使用,注意參數(shù)類不能是一個(gè)類的內(nèi)部類或者屬性類(除非包含參數(shù)類的類實(shí)現(xiàn)了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
一個(gè)變量在被定義后,在變量從ContextInstance刪除前,都可以被訪問(wèn)。當(dāng)變量被刪除后,去獲取該變量將返回為空。 6.4. 自定義類的實(shí)例作為流程變量 如果一個(gè)類的實(shí)例要作為流程變量使用,該類需要實(shí)現(xiàn)java.io.Serializable接口,并且定義序列化版本. //一個(gè)可以作為流程變量使用的類 class Wdz implements Serializable{ //為類指定序列化版本號(hào) private static final long serialVersionUID = private String name="wdz"; private int age=10; public String toString(){ return "name="+name+",age="+age; } } 上面的例子中,如果把類Wdz作為類WdzParent內(nèi)部類使用,然后當(dāng)成流程變量使用,那類WdzParent必須 也實(shí)現(xiàn)Serializable接口,否則會(huì)有問(wèn)題. 6.5. Transient variables
流程的歷史變量是不能持久化的,作用范圍是對(duì)整個(gè)流程全局有效的。 在ContextInstance類內(nèi)部,采用的是一個(gè)Map來(lái)存儲(chǔ)TransientVariable的信息 參考代碼 org.jbpm.context.exe.ContextInstance 的源代碼。 主要的相關(guān)方法 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 當(dāng)一個(gè)變量和流實(shí)例關(guān)聯(lián)(變量名字=”wdz”,value=”test”),如果在設(shè)置一個(gè)變量 (變量名字=”wdz”,value= new Integer(10)) ,那最后變量(變量名字=”wdz)的值是Integer(10)。 這稱之為overload. 6.7. Variables overriding
如果父流程有變量A(值=”value 6.8. 流程變量的持久化它依賴于流程實(shí)例的持久化,非TransientVariable隨流程實(shí)例的持久化一起被保存。 保存在數(shù)據(jù)表jbpm_variableinstance 參考 org.jbpm.context.exe.VariableInstance 6.9. Customizing variable persistence (可以進(jìn)一步了解)User java object <---> converter <---> variable instance 也就是自定義類的持久化需要定義自己的converter和變量實(shí)例類 converter和變量實(shí)例類需要繼承org.jbpm.context.exe.VariableInstance converter需要實(shí)現(xiàn)org.jbpm.context.exe.Converter接口 |
|