天天看點

activiti監聽器使用

分享牛原創(尊重原創 轉載對的時候第一行請注明,轉載出處來自分享牛http://blog.csdn.net/qq_30739519)

activiti使用的時候,通常需要跟業務緊密的結合在一起,有些業務非常的複雜,通常有如下一些場景:

1.activiti人員動态的配置設定。

2.目前任務節點完成的時候,指定需要指定下一個節點的處理人(比如,一個請假流程,a員工請假,需要指定下一步需要處理請假流程的上司。)。

3.任務節點完成的時候,需要一些複雜業務,(比如目前節點完成的時候,需要調用我們的jms消息系統發送消息)。

4.任務流轉到目前的節點的時候,需要監控目前任務節點的一些資訊或者其他的業務資訊。

5.目前的任務節點配置設定處理人的時候,需要觸發自定義的一些業務。

6.流程開始結束的時候,需要處理業務資訊。

7.經過任務節點的出線,也就是連線的時候,需要觸發自定義的業務。

那我們怎麼實作以上的這些需求呢?這個時候,我們就需要使用activiti監聽器,activiti提供的監聽器怎麼實作,以及如何觸發,這些都需要我們一步步了解。下面就詳細的介紹activiti監聽器。

從 activiti監聽器的使用範圍來看,大緻分為三種:

1.全局的監聽器。

2.連線的監聽器。

3.節點的監聽器。

下面我們一個個的來看如何使用這些監聽器。

全局監聽器主要使用的場景就是監控這個流程的啟動和結束。流程開始的時候可以監控,流程結束的時候可以監控,這裡說的是流程執行個體啟動結束的監控,并非是流程引擎的啟動結束監控。流程引擎的啟動結束監控可以參考http://blog.csdn.net/qq_30739519/article/details/51217614 不要混淆了這些概念。

下面我們先定義一個簡單的bpmn xml檔案看一下如何使用全局的監聽器。

ExecutionListener定義如下:流程執行個體start、end、take的時候調用。take是監控連線的時候使用的。

下面定義一個類監控流程執行個體的啟動監控,看如何使用。

activiti監聽器使用

流程的xml如下所示:

上面我們定義了兩個監聽器分别指向同一個類com.daling.ch1.listener.MyExecutionListener我們在類中監控事件。

com.daling.ch1.listener.MyExecutionListener類的實作如下所示:

下面我們部署啟動流程看一下效果,部署流程可參考之前的章節,啟動流程如下所示:

ProcessInstance processInstance = runtimeService

.startProcessInstanceByKey(key,vars);

我們看一下程式的部分輸出如下:

08:34:07.050 [main] DEBUG o.a.e.i.h.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY

08:34:07.056 [main] DEBUG o.a.e.i.h.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY

08:34:07.057 [main] DEBUG o.a.e.i.h.DefaultHistoryManager - Current history level: AUDIT, level required: FULL

start=========

08:34:07.064 [main] DEBUG o.a.e.i.p.r.AtomicOperationActivityExecute - ProcessInstance[107509] executes Activity(startevent1): org.activiti.engine.impl.bpmn.behavior.NoneStartEventActivityBehavior

08:34:07.064 [main] DEBUG o.a.e.i.p.e.J.selectJobsByExecutionId - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@eeb514]

08:34:07.064 [main] DEBUG o.a.e.i.p.e.J.selectJobsByExecutionId - ==>  Preparing: select * from ACT_RU_JOB J where J.EXECUTION_ID_ = ?

可以看出流程執行個體啟動的時候,觸發了我們自定義的類中的函數。

下面我們把usertask的任務結束,然後流程執行個體結束,看看觸發了我們自定義的類中的end沒有。

String taskId="107515";

demo.getTaskService().complete(taskId);

08:39:22.016 [main] DEBUG o.a.e.i.p.r.AtomicOperationActivityExecute - ProcessInstance[107509] executes Activity(endevent1): org.activiti.engine.impl.bpmn.behavior.NoneEndEventActivityBehavior

08:39:22.016 [main] DEBUG o.a.e.i.h.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY

end=========

在上面的全局監聽器中我們可以拿到DelegateExecution對象,這個對象可以讓我們操作activiti引擎中的一些東西,下面看一下DelegateExecution類中的定義。

DelegateExecution類圖如下:

activiti監聽器使用

啟動最常用的方法如下:

當節點結束的時候,經過連線的時候,我們可以線上上定義類,實作自己的業務邏輯。連線監聽器怎麼實作呢?

這裡為了友善測試,我們還是采用上面全局監聽器中的流程圖,下面我們自定義一個連線監聽器類,看看如何使用,可以拿到什麼對象。

activiti監聽器使用

上面我們定義了一個監聽器com.daling.ch1.listener.MyExecutionListener類中監控事件。

因為我們在flow3中定義的監聽類,是以流程經過flow3的時候觸發定義的take中的自定義事件。

在實際項目開發中,任務節點是經常用到的,是以我們必須要會使用節點監聽器。

TaskListener類的定義如下所示:

節點監聽器的子類如下圖所示:

activiti監聽器使用

下面開始我們詳細的使用吧。首先還是定義一個xml,xml流程還是上面所示的,隻是多了一些任務節點的監聽。

activiti監聽器使用

任務節點的監聽隻要實作TaskListener接口即可。下面是任務監聽的實作類,如下所示:

當流程運轉到usertask2我們看一下程式的輸出:

assignment========

create=========

因為usertask2節點配置了處理人是以觸發assignment事件監聽,當任務運轉到usertask2的時候觸發了create事件。

這裡我們也可以得出一個結論:assignment事件比create先執行。

使用代碼結束任務,代碼如下:

String taskId="127515";

當我們結束usertask2我們看一下程式的輸出:

complete===========

delete=============

在這裡我們可以得出結論:

任務完成的時候,觸發complete事件,因為任務完成之後,要從ACT_RU_TASK中删除這條記錄,是以觸發delete事件。

在上面的任務監聽器中我們可以拿到DelegateTask對象,這個對象可以讓我們操作activiti引擎中的一些東西,下面看一下DelegateTask類中的定義主要訪法。

上面我們總結了,全局監聽器、連線、任務節點的使用,下面我們看一下共性的東西再做一次總結。

上面我們在定義類的的時候,我們直接使用的類定義的方式,當然我們還可以跟sring整合使用,因為在實際項目中類的管理可能交給spring容器。使用也很簡單如下圖所示:

activiti監聽器使用

需要填寫的表達書,隻需要使用spring方式注入即可,${}裡面的值為需要使用的bean在spring中的id.可以xml定義或者在注解中定義。注解中定義需要開啟spring包掃描機制。比如我的@Service("myExecutionListener")。

1.activiti監聽方式分為三大類,節點監聽、全局監聽、連線監聽。

3.監聽器其實就是一個觀察者模式。(關于觀察者模式,我們後續章節講解,限于篇幅有限)

4.監聽器擷取spring對象,如何擷取spring中的bean呢?

5.監聽器關于觀察者模式,我們後續章節講解。

6.監聽器擷取spring對象,如何擷取spring中的bean呢?留到下一個章節講解吧。