jbpm用戶指南翻譯:第15章 記錄日誌

  
第15章 記錄日誌
記錄日誌的目的是爲了跟蹤流程執行的歷史,當流程執行的運行時數據變化時,所有增量都被保存到日誌。
不要把本章所述的流程日誌與軟件日誌相混淆,軟件日誌跟蹤軟件程序的執行(通常爲了調試),而流程日誌跟蹤流程實例的執行。
對於流程日誌信息有很多用途,非常明顯的用途就是根據一個流程執行的參與者查閱流程歷史。
另外一個用途就是業務活動監控(Business Activity Monitoring 簡寫BAM)。BAM將查詢或分析流程執行日誌,用來找出有關業務流程的有用的統計信息,例如:流程的每個步驟平均花費了多長時間?哪裏是流程瓶頸?…在一個組織裏,這些信息對於實現真正的業務流程管理是很關鍵的,真正的業務流程管理就是一個組織怎樣管理它們的流程,怎樣通過信息技術來支持流程,以及怎樣在一個迭代過程中改善流程。
還有一個用途就是撤消功能,流程日誌可被用於實現撤消。由於日誌包含了運行時信息的增量數據,因此日誌可以倒序播放,以把流程帶回以前的狀態。
15.1 創建日誌
日誌在運行流程執行時由jBPM模塊產生,另外用戶也可用插入流程日誌。日誌實體是一個繼承自org.jbpm.logging.log.ProcessLog的java對象,流程日誌實體被添加到LoggingInstance,LoggingInstance是ProcessInstance的一個可選的擴展。
jBPM生成多種日誌:圖執行日誌,上下文日誌和任務管理日誌。有關這些日誌包含的數據的更多信息,請查詢javadocs,最好從org.jbpm.loggin.log.ProcessLog類開始,因爲從這個類可導航到繼承樹。
LoggingInstance會聚集所有日誌實體,當ProcessInstance被保存時,LoggingInstance中的所有日誌將被清洗刷新(flush)到數據庫,ProcessInstance的logs數據成員(譯者注:logs應該是LoggingInstance的數據成員)並沒有用hibernate映射,用來避免在每個事務中都從數據庫中檢索日誌。每個ProcessLog在執行路徑(Token)的上下文中被製造,因此ProcessLog引用令牌,而令牌也作爲一個索引序號生成器爲令牌裏的ProcessLog索引提供服務,這對於日誌檢索是很重要的,這種方式下,在後續事務中產生的日誌將有一個連續的序號(哇,這裏會有許多序號:)。
對於發佈來說日誌是不重要的,在ProcessDefinition中去掉可選的LoggingDefinition就可以了,這將阻止LoggingInstance被捕獲,從而也就沒有日誌將被維護。今後我們將在日誌之上增加更加細粒度的配置控制,請參看jira“日誌級別配置”。
下面是添加流程日誌的API方法。
public class LoggingInstance extends ModuleInstance {
 ...
 public void addLog(ProcessLog processLog) {...}
 ...
}
日誌信息的UML圖如下:
15.1 日誌信息類圖
CompositeLog是一類特別的日誌實體,它作爲許多子日誌的父日誌,因此可以在日誌中創建一個層次結構,插入日誌的API如下:
public class LoggingInstance extends ModuleInstance {
 ...
 public void startCompositeLog(CompositeLog compositeLog) {...}
 public void endCompositeLog() {...}
 ...
}
CompositeLog應該總是在一個try-finally塊中被調用,以確保日誌的層次結構是一致的。例如:
startCompositeLog(new MyCompositeLog());
try {
 ...
} finally {
 endCompositeLog();
}
 
15.2 日誌檢索
如前面所說,日誌不能通過導航LoggingInstance到它的日誌從數據庫中檢索,作爲替代,流程實例的日誌總是可以從數據庫中查詢,LoggingSession有兩個方法用作這個目的。
第一個方法檢索一個流程實例的所有日誌,這些日誌在Map中根據令牌進行分組,map將爲流程實例中的每個令牌關聯一個ProcessLog列表,這個列表以與日誌創建時的相同的順序包含ProcessLog。
public class LoggingSession {
 ...
 public Map findLogsByProcessInstance(long processInstanceId) {...}
 ...
}
第二個方法爲指定的令牌檢索日誌,返回的列表以與日誌創建時的相同的順序包含ProcessLog。
public class LoggingSession {
 public List findLogsByToken(long tokenId) {...}
 ...
}
 
15.3 數據倉庫
有時你可能想要爲jbpm流程日誌使用數據倉庫,數據倉庫意味着你創建一個單獨的包含流程日誌的數據庫,以用於不同的用途。
可能有很多理由使你爲流程日誌信息創建一個數據倉庫,有時可能是爲了從所使用的數據庫中卸下繁重的查詢,另外一種情況可能是爲了做某些擴展的分析。可以對一個數據庫模式(schema)進行改進優化以適應其目的來實現數據倉庫。
在本章我們只是在jBPM中推薦了數據倉庫技術,用途是多變的,防止在jBPM中包含一個通用的解決方案來覆蓋所有的需求。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章