jBPM的學(xué)習(xí)心得
jBPM是JBOSS下的一個(gè)開(kāi)源java工作流項(xiàng)目,該項(xiàng)目提供eclipse插件,基于Hibernate實(shí)現(xiàn)數(shù)據(jù)持久化存儲(chǔ)。
參考
http://www.jboss.com/products/jbpm
當(dāng)eclipse安裝了myeclipse和jBPM時(shí)候,可能有沖突,具體表現(xiàn)在jBPM的流程設(shè)計(jì)器不能在eclipse中使用。
下面的配置參數(shù),根據(jù)需要可以修改:
jbpmtest是mysql中的schema的名字;
GBK是字符集,可以根據(jù)需要修改;
username=root,mysql數(shù)據(jù)庫(kù)的用戶(hù)名是root;
password=mysql ,mysql數(shù)據(jù)庫(kù)的用戶(hù)密碼是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
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
JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().dropSchema();
JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().createSchema();
這2個(gè)語(yǔ)針對(duì)mysq有效.
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.jboss.org/wiki/Wiki.jsp?page=JbpmOnOracle
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è)地方。
在Mysql安裝過(guò)程中指定相應(yīng)的默認(rèn)字符集是GBK
hibernate.connection.url=jdbc:mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK
<property name="hibernate.connection.url">jdbc:mysql://192.168.1.2/jbpmtest</property>
my.ini中 default-character-set=GBK
注意有2處需要修改
分成3種流程變量
全局變量(全局流程變量)
全局臨時(shí)變量(全局流程臨時(shí)變量)
局部變量(流程某個(gè)接點(diǎn)內(nèi)有效的變量)
@see org.jbpm.context.exe.ContextInstance
目前還沒(méi)有使用過(guò)局部變量(流程某個(gè)接點(diǎn)內(nèi)有效的變量)
流程變量的定義
· 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
所有基本類(lèi)型的包裹類(lèi)型,以及實(shí)現(xiàn)了Serializable的類(lèi)型都可以作為流程參數(shù)變量使用,注意參數(shù)類(lèi)不能是一個(gè)類(lèi)的內(nèi)部類(lèi)或者屬性類(lèi)(除非包含參數(shù)類(lèi)的類(lèi)實(shí)現(xiàn)了Serializable接口)
參考 org.jbpm.context.exe.VariableInstance
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);
一個(gè)變量在被定義后,在變量從ContextInstance刪除前,都可以被訪(fǎng)問(wèn)。當(dāng)變量被刪除后,去獲取該變量將返回為空。
如果一個(gè)類(lèi)的實(shí)例要作為流程變量使用,該類(lèi)需要實(shí)現(xiàn)java.io.Serializable接口,并且定義序列化版本.
//一個(gè)可以作為流程變量使用的類(lèi)
class Wdz implements Serializable{
//為類(lèi)指定序列化版本號(hào)
private static final long serialVersionUID =
private String name="wdz";
private int age=10;
public String toString(){
return "name="+name+",age="+age;
}
}
上面的例子中,如果把類(lèi)Wdz作為類(lèi)WdzParent內(nèi)部類(lèi)使用,然后當(dāng)成流程變量使用,那類(lèi)WdzParent必須 也實(shí)現(xiàn)Serializable接口,否則會(huì)有問(wèn)題.
流程的歷史變量是不能持久化的,作用范圍是對(duì)整個(gè)流程全局有效的。
在ContextInstance類(lèi)內(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)
當(dāng)一個(gè)變量和流實(shí)例關(guān)聯(lián)(變量名字=”wdz”,value=”test”),如果在設(shè)置一個(gè)變量
(變量名字=”wdz”,value= new Integer(10)) ,那最后變量(變量名字=”wdz)的值是Integer(10)。
這稱(chēng)之為overload.
如果父流程有變量A(值=”value
它依賴(lài)于流程實(shí)例的持久化,非TransientVariable隨流程實(shí)例的持久化一起被保存。
保存在數(shù)據(jù)表jbpm_variableinstance
參考 org.jbpm.context.exe.VariableInstance
User java object <---> converter <---> variable instance
也就是自定義類(lèi)的持久化需要定義自己的converter和變量實(shí)例類(lèi)
converter和變量實(shí)例類(lèi)需要繼承org.jbpm.context.exe.VariableInstance
converter需要實(shí)現(xiàn)org.jbpm.context.exe.Converter接口
聯(lián)系客服