引子
在之前寫的《activiti之事件日志》一文中講到,通過配置enableDatabaseEventLogging屬性可以達到事件觸發后,自動保存相關日志對象。這里面的實現原理就是本文要討論的內容。當一個事件觸發后,會由已經注冊好的監聽器去監聽到這個事件,然后在監聽器內部去實現相關邏輯。
配置監聽器Listener
- eventListeners 監聽所有的事件
- typedEventListeners 監聽指定事件類型的事件
- activiti:EventListener 只監聽特定流程定義的事件
相關類
- ActivitiEvent 事件對象類
- ActivitiEventListener 事件監聽器類
- ActivitiEventType 事件類型(枚舉類型)
示例
首先編寫一個監聽器類來監聽流程啟動事件,它繼承于ActivitiEventListener。
public class ProcessEventListener implements ActivitiEventListener {
private static final Logger logger = LoggerFactory.getLogger(HelloWorld.class);
public void onEvent(ActivitiEvent event) {
ActivitiEventType eventType = event.getType();
if(ActivitiEventType.ACTIVITY_STARTED.equals(eventType)){
logger.info("流程啟動");
}
}
public boolean isFailOnException() {
return false;
}
}
另外配置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="eventListeners">
<list>
<bean class="com.activiti.event.ProcessEventListener"></bean>
</list>
</property>
</bean>
將自己寫的監聽器類配置上去后,啟動流程后,就回打印出我們想要的“流程啟動”了。
上述配置方式監聽的是所有的事件,如果想要監聽特定的事件,需要配置如下:
<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="typedEventListeners">
<map>
<entry key="PROCESS_STARTED">
<list>
<bean class="com.activiti.event.ProcessEventListener"></bean>
</list>
</entry>
</map>
</property>
</bean>
這樣流程啟動后同樣也能監聽并打印日志了。
自定義事件監聽和發布
之前的事件都是activiti自帶的事件,如何自定義事件,并且監聽和發布呢?實現如下:
runtimeService.addEventListener(new ProcessEventListener());
runtimeService.dispatchEvent(new ActivitiEventImpl(ActivitiEventType.CUSTOM));
即首先發布事件監聽器,這里這個ProcessEventListener監聽器監聽所有事件,然后發布自定義事件。這樣就能自己監聽自己發布的事件了。
之前我們定義的監聽器繼承于ActivitiEventListener接口,實現了onEvent方法,自己去判斷事件類型,進行相應處理,這里再介紹一下工作流內部提供的實現類BaseEntityEventListener,這個類重寫了ActivitiEventListener接口的onEvent方法:
@Override
public final void onEvent(ActivitiEvent event) {
if (isValidEvent(event)) {
// Check if this event
if (event.getType() == ActivitiEventType.ENTITY_CREATED) {
onCreate(event);
} else if (event.getType() == ActivitiEventType.ENTITY_INITIALIZED) {
onInitialized(event);
} else if (event.getType() == ActivitiEventType.ENTITY_DELETED) {
onDelete(event);
} else if (event.getType() == ActivitiEventType.ENTITY_UPDATED) {
onUpdate(event);
} else {
// Entity-specific event
onEntityEvent(event);
}
}
}
protected void onCreate(ActivitiEvent event) {
// Default implementation is a NO-OP
}
......
所以如果只是用到基本的監聽事件,也可以繼承BaseEntityEventListener這個類,復寫它的onCreate等方法來實現監聽,會更加方便。