activiti学习(十五)

154 阅读2分钟

image.png 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

Activiti的使用

接着看看Activit中事件监听器的内容。

Activiti的事件监听器的配置

如果在流程引擎配置中配置了事件监听器,那么它将会在Activiti启动的时候就是活动的,重启流程引擎也会保持活动的状态。
属性eventListeners需要传入org.activiti.engine.delegate.event.ActivitiEventListener实例。通常情况下,您可以声明内联bean定义,也可以使用对现有bean的引用。以下代码段将事件监听器添加到配置中,在调度事件时,无论其类型如何,都会调用该逻辑:

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

要在某些事件被触发时调用监听器的逻辑,需使用typedEventListeners属性,该属性是一个Map类型。Map的键是以逗号分隔的事件名称列表(或单个事件名称)。Map的值是org.activiti.engine.delegate.event.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>

事件调度的顺序取决于监听器的添加顺序。首先,Activiti会根据传入的列表的顺序调用所有普通事件监听器(eventListeners属性)。如果触发了对应的事件,则会调用所有该事件监听器(typedEventListeners属性)。

在引擎运行期间添加监听器

可以使用API(RuntimeService)向引擎添加和删除其他事件监听器,如:void addEventListener(ActivitiEventListener listenerToAdd);void addEventListener(ActivitiEventListener listenerToAdd, ActivitiEventType... types); void removeEventListener(ActivitiEventListener listenerToRemove);

在流程定义中添加监听器

可以将监听程定义中。监听器将仅针对与流程定义相关的事件以及与以该特定流程定义启动的流程实例相关的所有事件调用。监听器实现可以使用全限定类的名称表达式,这是一个解析为实现监听器接口的bean的表达式,或者可以配置为引发消息/信号/错误的BPMN事件。

监听器的执行逻辑

下面的代码段向流程定义中添加了2个监听器。第一个监听器将接收任何类型的事件,监听器实现基于完全限定的类名。第二个监听器仅在作业成功执行或失败时才会收到通知,使用的监听器已在流程引擎配置的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>

对于与实体相关的事件,还可以将监听器添加到流程定义中,该流程定义仅在特定实体类型的实体事件发生时才会收到通知。下面的代码片段显示了如何实现这一点。它可以用于所有实体事件(第一个示例)或仅用于特定事件类型(第二个示例)。

<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>