activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便

简介: activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便

如果我们像给任务配置监听,按照常规的做法是这样的

00.png

一个个配置,比较麻烦。


现在利用ActivitiEventListener,监听全局事件,并且可以判断不同的事件类型,进而执行不同的业务逻辑。


1.定义事件处理handler接口

用接口来定义统一约定

public interface EventHandler {
    void handle(ActivitiEvent event);
}

2.实现不同事件

任务结束事件



*/
public class TaskCompleteListener implements EventHandler {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public void handle(ActivitiEvent event) {
        ActivitiEntityEventImpl eventImpl = (ActivitiEntityEventImpl) event;
        TaskEntity taskEntity = (TaskEntity) eventImpl.getEntity();
    }
}


任务创建事件

public class TaskCreateListener implements EventHandler {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public void handle(ActivitiEvent event) {
        ActivitiEntityEventImpl eventImpl = (ActivitiEntityEventImpl) event;
        TaskEntity taskEntity = (TaskEntity) eventImpl.getEntity();
    }

还有很多事件,比如TASK_ASSIGNED,PROCESS_STARTED,PROCESS_COMPLETED


3.实现ActivitiEventListener

public class GlobalEventListener implements ActivitiEventListener {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * 各类 Event 的处理器
     */
    private Map<ActivitiEventType, EventHandler> handlers = new HashMap<ActivitiEventType, EventHandler>();
    @Override
    public void onEvent(ActivitiEvent event) {
        EventHandler eventHandler = handlers.get(event.getType());
        if(eventHandler!=null){
            eventHandler.handle(event);
        }
    }
    @Override
    public boolean isFailOnException() {
        return false;
    }
    public Map<ActivitiEventType, EventHandler> getHandlers() {
        return handlers;
    }
    public void setHandlers(Map<ActivitiEventType, EventHandler> handlers) {
        this.handlers = handlers;
    }
}

4.注册事件监听

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource"/>
        <property name="transactionManager" ref="transactionManager"/>
        <property name="databaseSchemaUpdate" value="true"/>
        <property name="jobExecutorActivate" value="false"/>
        <property name="history" value="full"/>
        <property name="processDefinitionCacheLimit" value="10"/>
        <!-- 生成流程图的字体 -->
        <property name="activityFontName" value="宋体"/>
        <property name="labelFontName" value="宋体"/>
        <property name="annotationFontName" value="宋体"/>
        <!-- 自动部署 -->
        <property name="deploymentResources">
            <list>
                <value>classpath*:*</value>
            </list>
        </property>
        <!--  <property name="idGenerator" ref="idGenerator"/>-->
        <property name="eventListeners">
            <list>
                  <ref bean="globalEventListener"/>
            </list>
        </property>
        <property name="customFormTypes">
            <bean class="org.activiti.engine.impl.form.DateFormType">
                <constructor-arg value="yyyy-MM-dd HH:mm:ss"/>
            </bean>
        </property>
    </bean>
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>
    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
    <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/>
    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
    <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
    <!--流程全局事件处理器-->
    <bean id="globalEventListener" class="GlobalEventListener">
         <property name="handlers">
             <map>
                 <entry key="TASK_CREATED">
                     <bean class="TaskCreateListener"/>
                 </entry>
                   <entry key="TASK_COMPLETED">
                     <bean class="TaskCompleteListener"/>
                   </entry>
             </map>
         </property>
     </bean>

优点

  • 这样代码清晰,业务逻辑解耦,单一职责
  • 省去在bpmn.xml中配置,方便。


相关文章
|
3月前
|
小程序
在uniapp中监听globalData中的值变化
在uniapp中监听globalData中的值变化
124 0
|
2月前
|
JavaScript
如何使用`watch`选项来监听特定属性的变化?
如何使用`watch`选项来监听特定属性的变化?
11 0
|
2月前
当监听的属性是对象的引用时,`watch`选项是否会触发监听?
当监听的属性是对象的引用时,`watch`选项是否会触发监听?
13 2
|
7月前
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Vector,Rotator,Transform,Object,Actor。
42 0
|
11月前
Listener概述、监听对象的创建和销毁、监听域对象属性变化、监听会话相关的感知型监听器及监听器实现
Listener概述、监听对象的创建和销毁、监听域对象属性变化、监听会话相关的感知型监听器及监听器实现
67 0
|
Java
绑定监听事件的按钮运行结果错误原因及其解决方案
既然是窗口大小和按钮大小相同,那么一定是设置宽高的代码出现了问题,由于我们要使得代码冗余度降低,所以把按钮对象建在类中,所以在本类中的 this 关键字代表的就是JFrame窗体的大小,而不是按钮的大小
99 0
绑定监听事件的按钮运行结果错误原因及其解决方案
|
移动开发 前端开发 API
【前端】【H5 API】addEventListener监听网络状态的变动
【前端】【H5 API】addEventListener监听网络状态的变动
364 0
|
Java Spring
Activiti监听任务的几种方式
Activiti监听任务的几种方式
1200 0
【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
105 0
|
JSON 小程序 JavaScript
小程序事件、组件、生命周期、路由及数据请求
小程序事件、组件、生命周期、路由及数据请求
230 0
小程序事件、组件、生命周期、路由及数据请求