1. jBPM的簡單介紹
jBPM是JBOSS下的一個開源java工作流項目,該項目提供eclipse插件,基於Hibernate實現數據持久化存儲。
參考
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= 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 是jBPM的Oralce模型,包含對應的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();
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 文件中的字符集設置
<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接口