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:1521
rcl 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 文件中的字符集設置
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介面
[火星人 ] Java開源工作流(workflow)---JBPM學習心得總結已經有1626次圍觀