今天要分享的是activiti流程配置中的事件日志配置,它起到的作用是当工作流事件触发时,保存事件的日志到数据库中,记录日志。
首先我们在activiti.cfg.xml文件中添加属性如下:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db_activiti" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="abc123" />
<property name="enableDatabaseEventLogging" value="true"></property>
</bean>
上述配置中增加的属性就是enableDatabaseEventLogging,value设置为true,表示流程启动后会自动保存事件日志到数据库中,默认这个属性值为false,即不保存日志。虽然保存了事件日志,但是并不会直接打印到控制台上,为此,需要我们在代码中获取事件日志对象,并输出,下面是个示例:
// 1. 创建流程引擎 processEngine
// 2. 创建流程定义 processDefinition
// 3. 创建流程实例 processInstance
// 4. 获取事件日志对象列表
List<EventLogEntry> eventLogEntries = processEngine.
getManagementService().
getEventLogEntriesByProcessInstanceId(processInstance.getProcessInstanceId());
for(EventLogEntry eventLogEntry : eventLogEntries){
logger.info("eventLogEntries.type={},eventLogEntries.Data={}",eventLogEntry.getType(),eventLogEntry.getData());
}
logger.info("eventLogEntries.size={}",eventLogEntries.size());
上述代码中使用getManagementService()方法获取managerservice对象,并通过getEventLogEntriesByProcessInstanceId获取事件日志对象列表,最后显示这个List,结果输出如下:
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=PROCESSINSTANCE_START,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=ACTIVITY_STARTED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=ACTIVITY_COMPLETED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=SEQUENCEFLOW_TAKEN,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=ACTIVITY_STARTED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.type=TASK_CREATED,eventLogEntries.Data=[...]
[main] INFO com.activiti.HelloWorld - eventLogEntries.size=6
可以看到流程启动的过程中触发了上述6个事件,由于日志是保存到数据库中的,所以获取事件日志这个操作实际上也是从数据库读数据的过程。
下面我们来看下这个配置的实现过程。
首先,xml中添加这个属性对应于ProcessEngineConfigurationImpl类的方法:
public ProcessEngineConfigurationImpl setEnableDatabaseEventLogging(boolean enableDatabaseEventLogging) {
this.enableDatabaseEventLogging = enableDatabaseEventLogging;
return this;
}
这个this.enableDatabaseEventLogging方法在哪里用到呢?
public void initDatabaseEventLogging() {
if (enableDatabaseEventLogging) {
// Database event logging uses the default logging mechanism and adds
// a specific event listener to the list of event listeners
getEventDispatcher().addEventListener(new EventLogger(clock, objectMapper));
}
}
这个初始化方法会在流程引擎创建后的初始化方法中被调用,因此enableDatabaseEventLogging为true时就会添加一个事件监听器,当监听器监听到事件触发后保存日志信息。activiti内部的监听器具体的实现细节此处不再深入,后续将会有单独一篇博客来学习。
今天是中秋节假期,在家吹着凉风,写下这篇博客,记录一下学习过程。
网友评论