zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    随机id
    vue关于父组件调用子组件的方法
    ES6——块级作用域
    在vue中引用superMap
    MSSQL备份脚本
    Ubuntu 使用命令导出数据库
    CSS before 中文乱码
    CentOS7 安装linux 网络不联通问题
    SVN update failed问题解决
    JQ实现树形菜单点击高亮
  • 原文地址:https://www.cnblogs.com/starcrm/p/5948278.html
Copyright © 2011-2022 走看看