日志的目的是保持对流程执行的历史的跟踪. 作为流程执行改变的运行时数据, 所有的增量数据都会保存在日志里 .
此章所含盖的流程日志不要同软件日志混淆. 软件日志跟踪软件程序的运行(通常是为了调试的目的). 流程日志跟踪流程实例的执行流程实例.
流程日志信息有多种用途. 最明显的就是咨询特定流程执行的历史.
另外一个用途是业务活动监控(BAM-Business Activity Monitoring). BAM将查询和分析流程执行的日志来发现有用的关于业务流程的统计信息 .比如. 流程每个步骤平均花费了多少时间? 流程的瓶径在那里??在一个组织里这个信息是执行业务流程管理的关键. 真实业务流程管理是关于组织怎样管理它们的流程, 怎样支持信息技术*和*怎么改善迭代过程.
下一个用途是 是取消还原(undo)功能. 流程日志能用来执行取消还原(undo).由于日志包括增量的运行时间信息,日志能够按照相反的顺序把流程带回到以前的状态.
当运行流程执行的时候jBPM组件产生日志.用户也能插入流程日志. 日志条目是一个来自继承org.jbpm.logging.log.ProcessLog的java对象. 流程日志条目被加到 LoggingInstance . LoggingInstance是 ProcessInstance的一个可选扩展.
jBPM产生几种日志: 图执行日志,上下文日志和任务管理日志.更多有关这些日志中包含的数据的信息可以参考javadocs. 一个好的开始点是类 org.jbpm.logging.log.ProcessLog,因为从这个类你可以向下导航到继承树 .
LoggingInstance将收集所有的日志条目 . 当 ProcessInstance被保存 ,所有在 LoggingInstance中的日志将刷新到数据库里. ProcessInstance的 logs -field 没有用hiberate映射避免在每个事务里日志从数据库中检索. 每个 ProcessLog在执行路线上下文中( Token)产生并且 ProcessLog引用令牌 . 令牌被用做index-sequence 生成器为了令牌里的 ProcessLog索引 . 这对日志检索是重要的. 这个方法,随后的事务里产生的日志产生将有后面的顺序号. .
对部署来说日志是不重要的, 在ProcessDefinition里去掉额外的 LoggingDefinition是足够的 ?.阻止 LoggingInstance s 被捕捉导致日志没有维护.我们以后将增加更加精细颗粒的日志配置控制 . 参看问题 'log 级别配置'.
增加流程日志?API方法如下.
public class LoggingInstance extends ModuleInstance {
...
public void addLog(ProcessLog processLog) {...}
...
}
日志信息的UML图如下:
CompositeLog 是特殊类别的日志条目 .它用做数个子日志的父母日志, 因此在日志里建立层级结构.?插入日志API如下
public class LoggingInstance extends ModuleInstance {
...
public void startCompositeLog(CompositeLog compositeLog) {...}
public void endCompositeLog() {...}
...
}
CompositeLog总是在 try-finally -block中被调用以确保层级结构日志是一致的. 比如:
startCompositeLog(new MyCompositeLog());
try {
...
} finally {
endCompositeLog();
}
如前所说,日志不能通过LoggingInstance?导航到它的日志来从数据库中检索.作为替代,流程实例日志总是从数据库中查询. LoggingSession有两个方法用做这个目的 .
第一个方法检索所有流程实例的日志.这些日志将被令牌组织成一个Map. 此map将通过流程实例的每个令牌关联到ProcessLogs列表。清单包含ProcessLogs 同它们建立的顺序一样.
public class LoggingSession {
...
public Map findLogsByProcessInstance(long processInstanceId) {...}
...
}
第二个方法检索指定的令牌的日志. 结果列表包括ProcessLogs,同它们建立的顺序一样.
public class LoggingSession {
public List findLogsByToken(long tokenId) {...}
...
}