Liferay7 BPM門戶開發之4: Activiti事件處理和監聽Event handlers


事件機制從Activiti 5.15開始引入,這非常棒,他可以讓你實現委托。

可以通過配置添加事件監聽器,也可以通過Runtime API加入注冊事件。

所有的事件參數子類型都來自org.activiti.engine.delegate.event.ActivitiEvent

包含的信息:

  • type
  • executionId
  • processInstanceId
  • processDefinitionId

 

事件監聽

其中,JOB_EXECUTION_SUCCESS 和JOB_EXECUTION_FAILURE 是ActivitiEvent的 type 信息,即事件類型

public class MyEventListener implements ActivitiEventListener {

  @Override
  public void onEvent(ActivitiEvent event) {
    switch (event.getType()) {

      case JOB_EXECUTION_SUCCESS:
        System.out.println("A job well done!");
        break;

      case JOB_EXECUTION_FAILURE:
        System.out.println("A job has failed...");
        break;

      default:
        System.out.println("Event received: " + event.getType());
    }
  }

  @Override
  public boolean isFailOnException() {
    // The logic in the onEvent method of this listener is not critical, exceptions
    // can be ignored if logging fails...
    return false;
  }
}

 

org.activiti.engine.delegate.event.BaseEntityEventListener

BaseEntityEventListener 是entity-events事件監聽器的基類,不需要類型檢查,可以用來監聽一種特定類型的實體或所有實體相關的事件:

  • onCreate(..)
  • onUpdate(..)
  • onDelete(..)
  • onEntityEvent(..)

 

通過配置注冊事件實例

配置方法:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    ...
    <property name="eventListeners">
      <list>
         <bean class="org.activiti.engine.example.MyEventListener" />
      </list>
    </property>
</bean>

屬性eventListeners 用來設置org.activiti.engine.delegate.event.ActivitiEventListener 的實例,注意:它是列表,可以多個。

typedEventListeners 用來設置基於事件類型分發的ActivitiEventListener 的實例:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    ...
    <property name="typedEventListeners">
      <map>
        <entry key="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" >
          <list>
            <bean class="org.activiti.engine.example.MyJobEventListener" />
          </list>
        </entry>
      </map>
    </property>
</bean>

 

通過Runtime API注冊事件實例

方法是通過RuntimeService

void addEventListener(ActivitiEventListener listenerToAdd);

void addEventListener(ActivitiEventListener listenerToAdd, ActivitiEventType... types);

void removeEventListener(ActivitiEventListener listenerToRemove);

 

通過流程定義注冊事件實例

可以將事件監聽器添加到一個特定的流程定義中,偵聽器只會被調用與流程定義相關的事件,用於拋出message/signal/error 到BPMN event
而processEngineConfiguration配置的方法是全局的。
下面的例子:
第一個監聽器將接收任何類型的事件,基於一個完全限定的類名稱(fully-qualified class name)的監聽器實現。
第二個監聽器只通知當一個作業成功執行或失敗時,使用已被定義在進程引擎配置的bean屬性中的監聽器。

<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener class="org.activiti.engine.test.MyEventListener" />
    <activiti:eventListener delegateExpression="${testEventListener}" events="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" />
  </extensionElements>

  ...

</process>

BaseEntityEventListener 也可以注冊:

entityType實體類型包含:

  • attachment
  • comment
  • execution
  • identity-link
  • job
  • process-instance
  • process-definition
  • task
<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener class="org.activiti.engine.test.MyEventListener" entityType="task" />
    <activiti:eventListener delegateExpression="${testEventListener}" events="ENTITY_CREATED" entityType="task" />
  </extensionElements>

  ...

</process>
throwing BPMN events
<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="signal" signalName="My signal" events="TASK_ASSIGNED" />
  </extensionElements>
</process>


<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="globalSignal" signalName="My signal" events="TASK_ASSIGNED" />
  </extensionElements>
</process>


<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="message" messageName="My message" events="TASK_ASSIGNED" />
  </extensionElements>
</process>


<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="error" errorCode="123" events="TASK_ASSIGNED" />
  </extensionElements>
</process>

只能通過RuntimeService 分發:

void dispatchEvent(ActivitiEvent event);

 

事件類型

事件名稱                             描述                                                                                           事件類型

ENGINE_CREATED 監聽器監聽的流程引擎已經創建完畢,並准備好接受API調用。 org.activiti...ActivitiEvent
ENGINE_CLOSED 監聽器監聽的流程引擎已經關閉,不再接受API調用。 org.activiti...ActivitiEvent
ENTITY_CREATED 創建了一個新實體。實體包含在事件中。 org.activiti...ActivitiEntityEvent
ENTITY_INITIALIZED 創建了一個新實體,初始化也完成了。如果這個實體的創建會包含子實體的創建,這個事件會在子實體都創建/初始化完成后被觸發,這是與 ENTITY_CREATED的區別。 org.activiti...ActivitiEntityEvent
ENTITY_UPDATED 更新了已存在的實體。實體包含在事件中。 org.activiti...ActivitiEntityEvent
ENTITY_DELETED 刪除了已存在的實體。實體包含在事件中。 org.activiti...ActivitiEntityEvent
ENTITY_SUSPENDED 暫停了已存在的實體。實體包含在事件中。會被ProcessDefinitions, ProcessInstances 和 Tasks拋出。 org.activiti...ActivitiEntityEvent
ENTITY_ACTIVATED 激活了已存在的實體,實體包含在事件中。會被ProcessDefinitions, ProcessInstances 和 Tasks拋出。 org.activiti...ActivitiEntityEvent
JOB_EXECUTION_SUCCESS 作業執行成功。job包含在事件中。 org.activiti...ActivitiEntityEvent
JOB_EXECUTION_FAILURE 作業執行失敗。作業和異常信息包含在事件中。 org.activiti...ActivitiEntityEvent and org.activiti...ActivitiExceptionEvent
JOB_RETRIES_DECREMENTED 因為作業執行失敗,導致重試次數減少。作業包含在事件中。 org.activiti...ActivitiEntityEvent
TIMER_FIRED 觸發了定時器。job包含在事件中。 org.activiti...ActivitiEntityEvent
JOB_CANCELED 取消了一個作業。事件包含取消的作業。作業可以通過API調用取消, 任務完成后對應的邊界定時器也會取消,在新流程定義發布時也會取消。 org.activiti...ActivitiEntityEvent
ACTIVITY_STARTED 一個節點開始執行 org.activiti...ActivitiActivityEvent
ACTIVITY_COMPLETED 一個節點成功結束 org.activiti...ActivitiActivityEvent
ACTIVITY_SIGNALED 一個節點收到了一個信號 org.activiti...ActivitiSignalEvent
ACTIVITY_MESSAGE_RECEIVED 一個節點收到了一個消息。在節點收到消息之前觸發。收到后,會觸發 ACTIVITY_SIGNAL或 ACTIVITY_STARTED,這會根據節點的類型(邊界事件,事件子流程開始事件) org.activiti...ActivitiMessageEvent
ACTIVITY_ERROR_RECEIVED 一個節點收到了一個錯誤事件。在節點實際處理錯誤之前觸發。 事件的 activityId對應着處理錯誤的節點。 這個事件后續會是 ACTIVITY_SIGNALLED或 ACTIVITY_COMPLETE, 如果錯誤發送成功的話。 org.activiti...ActivitiErrorEvent
UNCAUGHT_BPMN_ERROR 拋出了未捕獲的BPMN錯誤。流程沒有提供針對這個錯誤的處理器。 事件的 activityId為空。 org.activiti...ActivitiErrorEvent
ACTIVITY_COMPENSATE 一個節點將要被補償。事件包含了將要執行補償的節點id。 org.activiti...ActivitiActivityEvent
VARIABLE_CREATED 創建了一個變量。事件包含變量名,變量值和對應的分支或任務(如果存在)。 org.activiti...ActivitiVariableEvent
VARIABLE_UPDATED 更新了一個變量。事件包含變量名,變量值和對應的分支或任務(如果存在)。 org.activiti...ActivitiVariableEvent
VARIABLE_DELETED 刪除了一個變量。事件包含變量名,變量值和對應的分支或任務(如果存在)。 org.activiti...ActivitiVariableEvent
TASK_ASSIGNED 任務被分配給了一個人員。事件包含任務。 org.activiti...ActivitiEntityEvent
TASK_CREATED 創建了新任務。它位於 ENTITY_CREATE事件之后。當任務是由流程創建時, 這個事件會在TaskListener執行之前被執行。 org.activiti...ActivitiEntityEvent
TASK_COMPLETED 任務被完成了。它會在 ENTITY_DELETE事件之前觸發。當任務是流程一部分時,事件會在流程繼續運行之前, 后續事件將是 ACTIVITY_COMPLETE,對應着完成任務的節點。 org.activiti...ActivitiEntityEvent
TASK_TIMEOUT 任務已超時,在 TIMER_FIRED事件之后,會觸發用戶任務的超時事件, 當這個任務分配了一個定時器的時候。 org.activiti...ActivitiEntityEvent
PROCESS_COMPLETED 流程已結束。在最后一個節點的 ACTIVITY_COMPLETED事件之后觸發。 當流程到達的狀態,沒有任何后續連線時, 流程就會結束。 org.activiti...ActivitiEntityEvent
MEMBERSHIP_CREATED 用戶被添加到一個組里。事件包含了用戶和組的id。 org.activiti...ActivitiMembershipEvent
MEMBERSHIP_DELETED 用戶被從一個組中刪除。事件包含了用戶和組的id。 org.activiti...ActivitiMembershipEvent
MEMBERSHIPS_DELETED 所有成員被從一個組中刪除。在成員刪除之前觸發這個事件,所以他們都是可以訪問的。 因為性能方面的考慮,不會為每個成員觸發單獨的 MEMBERSHIP_DELETED事件。 org.activiti...ActivitiMembershipEvent


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM