程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> jBPM-4.0中文開發指南-第14章 持久化

jBPM-4.0中文開發指南-第14章 持久化

編輯:關於JAVA

第 14 章 持久化

14.1. 標准環境配置

這一節描述了環境如何配置 來在標准Java環境中使用hibernate.

01 | <jbpm-configuration>
02 |
03 |   <process-engine>
04 |      <hibernate-session-factory />
05 |     <hibernate- configuration>
06 |       <properties resource="hibernate.properties" />
07 |       <mapping resource="jbpm.pvm.typedefs.hbm.xml" />
08 |        <mapping resource="jbpm.pvm.wire.hbm.xml" />
09 |       <mapping resource="jbpm.pvm.definition.hbm.xml" />
10 |       <mapping resource="jbpm.pvm.execution.hbm.xml" />
11 |       <mapping resource="jbpm.pvm.variable.hbm.xml" />
12 |       <mapping resource="jbpm.pvm.job.hbm.xml" />
13 |       <mapping resource="jbpm.jpdl.hbm.xml" />
14 |       <cache-configuration resource="jbpm.pvm.cache.xml"
15 |                           usage="nonstrict-read-write" />
16 |     </hibernate-configuration>
17 |    </process-engine>
18 |
19 |   <transaction-context>
20 |     <standard-transaction />
21 |     <hibernate-session />
22 |     <pvm-db-session />
23 |   </transaction-context>
24 |
25 | </jbpm -configuration>

line 04在流程引擎環境下指定了一個hibernate會話。 這意味著hibernate會話工廠會被延遲創建, 當它第一次需要時, 會緩存到EnvironmentFactory中。

一個hibernate會話工廠在一個hibernate配置中 通過調用buildSessionFactory()方法創建。 默認 情況下,hibernate配置會根據類型進行查找。

line 05指定一個hibernate配置。

line 06指定資源文件 hibernate.properties應該被加載到配置中。

line 07 - 13指定映射資源文件。

line 14 - 15提供一個單獨的地方來指定 hibernate緩存策略,為所有的PVM類和集合。

line 20指定一個標准事務。 這是一個非常簡單的全局事務策略, 沒有可以用在標准環境下的恢復, 會獲得所有或沒有符合語義的多個事務型資源之上。

line 21指定hibernate會話, 會自動注冊它自己,使用標准事務。

line 22指定一個PvmDbSession. 那是一個類,添加了方法綁定到特定的查詢, 將在hiberante會話中 執行。

14.2. 標准hibernate配置

這兒是一系列的默認配置, 來在標准Java環境下和hsqldb一起配置hibernate.

hibernate.dialect                      org.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class      org.hsqldb.jdbcDriver
hibernate.connection.url               jdbc:hsqldb:mem:.
hibernate.connection.username          sa
hibernate.connection.password
hibernate.cache.use_second_level_cache true
hibernate.cache.provider_class         org.hibernate.cache.HashtableCacheProvider

在開發中可以選擇數據庫結構導出, 在會話工廠創建的時候創建數據庫結構, 在會話工廠關閉的時 候刪除數據庫結構。

hibernate.hbm2ddl.auto                 create-drop

為了了解更多關於hibernate配置, 可以參考hibernate引用手冊。

14.3. 標准事務

默認情況下,<hibernate-session />會使用 session.beginTransaction()啟動hibernate事 務。 然後hibernate事務會封裝成一個 org.jbpm.pvm.internal.hibernate.HibernateTransactionResource 資源被支持在<standard- transaction /> (org.jbpm.tx.StandardTransaction)。

在環境塊內部,通過environment.getTransaction() 獲得事務。所以在環境塊內,事務可以通過 environment.getTransaction()。setRollbackOnly() 回滾。

當初創建時,標准事務會把自己注冊, 在環境關閉時會被提醒。所以在關閉時, 標准事務會提交或 回滾 根據是否地調用了setRollbackOnly()。

所以在上面的配置中,每個環境塊會擁有獨立的事務。 至少,如果使用的是hibernate會話。

14.4. 流程實例化的基礎

在下個例子中,我們將演示hibernate持久化是如何使用在 一個具體例子中的。'persistent process'是一個簡單的 三步流程:

圖 14.1. 持久化流程

三個活動會是等待狀態, 就像第 5.4 節 “ExternalActivity實例”。

為了確認我們持久化了這個類,我們為它創建了hibernate映射, 並像這樣把它添加到配置文件中:

<hibernate-configuration>
  <properties resource="hibernate.properties" />
  <mapping resource="jbpm.pvm.typedefs.hbm.xml" />
  <mapping resource="jbpm.pvm.wire.hbm.xml" />
  <mapping resource="jbpm.pvm.definition.hbm.xml" />
  <mapping resource="jbpm.pvm.execution.hbm.xml" />
  <mapping resource="jbpm.pvm.variable.hbm.xml" />
  <mapping resource="jbpm.pvm.job.hbm.xml" />
  <mapping resource="jbpm.jpdl.hbm.xml" />
  <mapping resource="org/jbpm/examples/ch09/state.hbm.xml" />
  <cache-configuration resource="jbpm.pvm.cache.xml"
                       usage="nonstrict-read-write" />
</hibernate-configuration>

下一個代碼片段演示了一個單元測試方法的內容。 這個方法首先創建環境工廠,然後,在第一個事務 中, 一個流程定義會被創建, 並保存到數據庫。然後第二個事務會創建這那個流程的一個新執行。 下 面的兩個事物會向執行提供外部觸發器。

EnvironmentFactory environmentFactory = EnvironmentFactory.parse(new ResourceStreamSource(
    "org/jbpm/examples/ch09/environment.cfg.xml"
));

然後在第一個事務中,一個流程被創建了,並保存到數據庫中。 這是一個通常的引用,像是發布一個 流程, 它只需要執行一次。

Environment environment = environmentFactory.openEnvironment();
try {
  PvmDbSession pvmDbSession = environment.get(PvmDbSession.class);

  ProcessDefinition processDefinition = ProcessFactory.build("persisted process")
    .activity ("one").initial().behaviour(new State())
      .transition().to("two")
    .activity("two").behaviour(new State())
      .transition().to("three")
    .activity("three").behaviour(new State())
  .done();

  pvmDbSession.save (processDefinition);
} finally {
  environment.close();
}

在前一個事務中,流程定義,活動,轉移 會被插入到數據庫表中。

接下來我們演示一個流程定義的新流程執行是如何啟動的。 注意在這個情況下,我們提供了一個業務 鍵 叫做'first'.這會讓我們更簡單的處理相同的執行 從數據庫的事務中。在啟動新流程執行後, 它會 等待'one'活動 因為行為是一個等待狀態。

environment = environmentFactory.openEnvironment();
try {
  PvmDbSession pvmDbSession = environment.get(PvmDbSession.class);

  ProcessDefinition processDefinition = pvmDbSession.findProcessDefinition("persisted process");
  assertNotNull(processDefinition);

  Execution execution = processDefinition.startExecution("first");
  assertEquals("one", execution.getActivity ().getName());
  pvmDbSession.save(execution);

} finally {
  environment.close();
}

在上一個事務中,一個新執行記錄會被插入到 數據庫中。

下一步,我們反饋一個外部觸發器到這個存在的流程執行中。 我們讀取執行,提供一個signal,然後 只是把它保存回數據庫中。

environment = environmentFactory.openEnvironment();
try {
  PvmDbSession pvmDbSession = environment.get(PvmDbSession.class);

  Execution execution = pvmDbSession.findExecution("persisted process", "first");
  assertNotNull (execution);
  assertEquals("one", execution.getActivity().getName());

  // external trigger that will cause the execution to execute until
  // it reaches the next wait state
  execution.signal();

  assertEquals("two", execution.getActivity ().getName());

  pvmDbSession.save(execution);

} finally {
  environment.close();
}

前一個事務會對已存在的執行進行更新, 重新分配外鍵,引用活動表中的 另一條記錄。

UPDATE JBPM_EXECUTION
SET
  NODE_=?,
  DBVERSION_=?,
  ...
WHERE DBID_=?
  AND DBVERSION_=?

SQL中的版本,顯示了自動樂觀鎖,加入了PVM持久化中 所以流程持久化可以很容易 在多JVM或多機器 環境下使用。

在實例代碼中,這裡又有一個事務,它與前一個事務 完全相同,從'two'活動到'three'活動 獲得了 執行。

所有這個展示了PVM可以在事務中從一個等待狀態移動到 另一個等待狀態。每個事務對應 一個狀態轉 移。

注意在自動活動的情況下,多個活動會在執行 到達一個等待狀態前被執行。 一般來說這是期望的行 為。一旦自動活動消耗太長時間, 你不希望阻塞原始事務,等待這些自動活動的完成, 參考??? 來 獲得它可以如何在流程定義之間將事務劃分界限, 這也可以看做是一個流程執行過程中的安全點。

14.5. 業務鍵

TODO

TODO: 常規的持久化架構

TODO: 對象引用

TODO: 線程,通過分支和結合實現同步

TODO: 緩存

TODO: 流程實例遷移

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved