今天要分享的是activiti流程配置中的事件日志配置炫加,它起到的作用是當(dāng)工作流事件觸發(fā)時(shí)歧焦,保存事件的日志到數(shù)據(jù)庫(kù)中姨伤,記錄日志。
首先我們?cè)赼ctiviti.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設(shè)置為true,表示流程啟動(dòng)后會(huì)自動(dòng)保存事件日志到數(shù)據(jù)庫(kù)中,默認(rèn)這個(gè)屬性值為false梗劫,即不保存日志享甸。雖然保存了事件日志,但是并不會(huì)直接打印到控制臺(tái)上梳侨,為此蛉威,需要我們?cè)诖a中獲取事件日志對(duì)象,并輸出走哺,下面是個(gè)示例:
// 1. 創(chuàng)建流程引擎 processEngine
// 2. 創(chuàng)建流程定義 processDefinition
// 3. 創(chuàng)建流程實(shí)例 processInstance
// 4. 獲取事件日志對(duì)象列表
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對(duì)象蚯嫌,并通過getEventLogEntriesByProcessInstanceId獲取事件日志對(duì)象列表,最后顯示這個(gè)List割坠,結(jié)果輸出如下:
[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
可以看到流程啟動(dòng)的過程中觸發(fā)了上述6個(gè)事件齐帚,由于日志是保存到數(shù)據(jù)庫(kù)中的,所以獲取事件日志這個(gè)操作實(shí)際上也是從數(shù)據(jù)庫(kù)讀數(shù)據(jù)的過程彼哼。
下面我們來(lái)看下這個(gè)配置的實(shí)現(xiàn)過程对妄。
首先,xml中添加這個(gè)屬性對(duì)應(yīng)于ProcessEngineConfigurationImpl類的方法:
public ProcessEngineConfigurationImpl setEnableDatabaseEventLogging(boolean enableDatabaseEventLogging) {
this.enableDatabaseEventLogging = enableDatabaseEventLogging;
return this;
}
這個(gè)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));
}
}
這個(gè)初始化方法會(huì)在流程引擎創(chuàng)建后的初始化方法中被調(diào)用剪菱,因此enableDatabaseEventLogging為true時(shí)就會(huì)添加一個(gè)事件監(jiān)聽器,當(dāng)監(jiān)聽器監(jiān)聽到事件觸發(fā)后保存日志信息拴签。activiti內(nèi)部的監(jiān)聽器具體的實(shí)現(xiàn)細(xì)節(jié)此處不再深入孝常,后續(xù)將會(huì)有單獨(dú)一篇博客來(lái)學(xué)習(xí)。
今天是中秋節(jié)假期蚓哩,在家吹著涼風(fēng)构灸,寫下這篇博客,記錄一下學(xué)習(xí)過程岸梨。