`
zhangym195
  • 浏览: 121540 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类
最新评论

jBPM jPDL 用户开发手册 3.2.3 - 第19章

阅读更多

19 日志

日志的目标是保持追踪流程执行的历史。在运行时流程执行数据的改变、所有数据delta's)被存储在日志中。

本章所涉及的流程日志,不要同软件日志混淆。软件日志跟踪软件程序的执行(通常是为了除错)。流程日志跟踪流程实例的执行。

流程日志信息有各种用例。最明示的是通过流程执行的参与人查询流程历史。

另一个用例是业务活动监控(Business Activity Monitoring (BAM))。BAM将查询或分析流程执行的日志来找出关于业务过程的有用的统计信息。例如:流程的每一步平均花费多少时间?流程中哪里有瓶颈?……这样的信息是一个组织实现真正的流程管理的关键。真正的业务流程管理是关于组织如何管理他们的流程、如何通过通过信息技术来支持以及如何在一个迭代流程改善其他的方面。

再一个用途是撤消(undo)功能。 流程日志能够用于实现撤消。既然日志包含运行时信息的数据(delta's),那样日志就能够反向将流程带回到前一个状态。[

Since the logs contain the delta's of the runtime information, the logs can be played in reverse order to bring the process back into a previous state.]

19.1. 创建日志

当流程执行运行时日志被jBPM产生。但是用户也能插入流程日志。一个日志项是一个继承自org.jbpm.logging.log.ProcessLog java对象。流程日志项被增加到一个LoggingInstance上。LoggingInstanceProcessInstance的可选的扩展。

不同日志种类被jBPM生成:图执行日志(graph execution logs)、上下文(context logs)和任务管理日志(and task management logs)。更多的关于那些日志所包含的特定的数据,参考javadocs 文档。一个好的开始点是类org.jbpm.logging.log.ProcessLog ,因为从那个类中你可以向下导航这个继承树。

LoggingInstance将收集日志项。当ProcessInstance被存储时,所有LoggingInstance中的日志将被刷新到数据库中。为了避免每一个事务都要从数据库中进行检索ProcessInstance日志域(logs-field)并没有同hibernate进行映射。 每一个ProcessLog在执行(Token)路径的上下文中产生,随后ProcessLog引用那个token。这个Token也当作TokenProcessLog索引的顺序索引(idnex-sequence)生成器。这个对于日志检索是很重要的。那样,随后的事务生成的日志将有一个连续的顺序号。(喔,那里有许多的序号噢 :-s)。

下列是增加流程日志的API方法。

public class LoggingInstance extends ModuleInstance {

  ...

  public void addLog(ProcessLog processLog) {...}

  ...

}

 日志信息的UML图看起来像这样:

jBPM日志信息类图

19.1 jBPM日志信息类图

CompositeLog是一个特殊种类的日志项。它作为若干子日志的父日志,因此这是创建日志中层次结构的手段。下面是插入日志的API

public class LoggingInstance extends ModuleInstance {

  ...

  public void startCompositeLog(CompositeLog compositeLog) {...}

  public void endCompositeLog() {...}

  ...

}

CompositeLogs应该总是放在try-finally块中进行调用以保证日志层次结构是一致的。例如:

startCompositeLog(new MyCompositeLog());

try {

  ...

} finally {

  endCompositeLog();

}

19.2. 日志配置

日志部署在哪并不重要,在jbpm.cfg.xml 配置文件中的jbpm-context部分移除日志行就足够了。

<service name='logging' factory='org.jbpm.logging.db.DbLoggingServiceFactory' />

万一你想过滤日志,你需要写一个自定义的DbLoggingService子类LoggingService的实现。你还需要创建一个定制的日志ServiceFactory并在factory属性中指定它。

 

19.3. 日志检索

正像前面讲的,日志不能通过定位LoggingInstance到它的日志从数据库中被检索。取而代之的是,流程实例的日志总可以从数据库中被查询。LoggingSession有两个方法来实现这个目标:

 第一个方法为流程实例检索所有的日志。日志将通过token分组MAP。这个map将同流程实例中的每个TokenProcessLogs列表相关联。列表将以相同的顺序包含ProcessLogs当他们创建时。

public class LoggingSession {

  ...

  public Map findLogsByProcessInstance(long processInstanceId) {...}

  ...

}

第二方法为特定的Token检索日志。返回的列表将以相同的顺序包含ProcessLogs当他们创建时。

public class LoggingSession {

  public List findLogsByToken(long tokenId) {...}

  ...

}

19.4.数据仓库

有时你可能想应用数据仓库技术到jbpm流程日志上。数据仓库意味着你将创建一个独立的数据库来包含为各种目标而使用的流程日志。

有多种为流程日志信息创建数据仓库的原因。有时它可能是一个在线的产品数据库中非重载荷的查询。其他情况下它可能做一些扩展性的分析。数据库仓库甚至可能修改数据库模式以优化它。

本节,我们只想计划下jBPM上下文中的数据库仓库技术。这个目标太分散,限制了可以包含在jBPM中能覆盖所有需求的一个通用的解决方法。

 

 

 

:-S

  • 大小: 5.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics