【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )

简介: 【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )

文章目录

一、根据事件类型获取订阅者

二、调用订阅方法





一、根据事件类型获取订阅者


接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) ;


通过事件类型到 Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找相应的 订阅对象 + 订阅方法 ;


获取事件类型 :


   

// 获取事件类型
        Class<?> eventType = event.getClass();


Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找事件类型对应的订阅者 ;


     

// 获取事件类型对应的 订阅者 集合
        CopyOnWriteArrayList<MySubscription> subscriptions =
                subscriptionsByEventType.get(eventType);


遍历并调用订阅者 :


     

// 确保订阅者大于等于 1 个
        if (subscriptions != null && subscriptions.size() > 0) {
            // 遍历订阅者并调用订阅方法
            for (MySubscription subscription : subscriptions) {
                postSingleSubscription(subscription, event);
            }
        }



部分代码示例 :


/**
     * 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象
     *      将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 )
     *      通过事件类型到
     *      Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType
     *      集合中查找相应的 订阅对象 + 订阅方法
     * @param event
     */
    public void post(Object event) {
        // 获取事件类型
        Class<?> eventType = event.getClass();
        // 获取事件类型对应的 订阅者 集合
        CopyOnWriteArrayList<MySubscription> subscriptions =
                subscriptionsByEventType.get(eventType);
        // 确保订阅者大于等于 1 个
        if (subscriptions != null && subscriptions.size() > 0) {
            // 遍历订阅者并调用订阅方法
            for (MySubscription subscription : subscriptions) {
                postSingleSubscription(subscription, event);
            }
        }
    }





二、调用订阅方法


通过反射调用订阅方法 ;


在 MySubscription 中封装了 订阅者对象 和 订阅方法 , 订阅方法中封装了 Method 方法 ;


直接调用 Method 对象的 invoke 方法 , 通过反射调用订阅方法 , 传入的第一个参数是 订阅者对象 , 即订阅方法所在的对象 , 传入的第二个参数是 订阅方法接收的事件参数对象 ;


 

/**
     * 调用订阅者的订阅方法
     * @param subscription 订阅者对象 + 订阅方法
     * @param event 发布者传递的消息事件
     */
    private void invokeMethod(MySubscription subscription, Object event) {
        try {
            // 通过反射调用订阅方法
            subscription.getSubscriberMethod().getMethod().invoke(
                    subscription.getSubscriber(),   // 订阅者对象
                    event                           // 事件参数类型
            );
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
目录
相关文章
页面第二次进入或者多次进入,事件总线触发事件多次,eventBus触发多次
页面第二次进入或者多次进入,事件总线触发事件多次,eventBus触发多次
|
开发工具 开发者
消息服务-事件通知使用 | 学习笔记
快速学习消息服务-事件通知使用
消息服务-事件通知使用 | 学习笔记
|
消息中间件 网络协议
RabbiMQ中的消息回调与消息确认
和生产者的消息确认机制不同,因为消息接收本来就是在监听消息,符合条件的消息就会消费下来。 所以,消息接收的确认机制主要存在三种模式 1.自动确认 这也是默认的消息确认情况。AcknowledgeMode.NONE,RabbitMQ成功将消息发出(即将消息成功写入TCP Socket)中立即 认为本次投递已经被正确处理,不管消费者端是否成功处理本次投递 当自动应答等于true的时候,表示当消费者一收到消息就表示消费者收到了消息,消费者收到了消息就会立即从队列中删除 2.不确认(不介绍) 3.手动确认(多数选择的模式) 消费者收
【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(一)
【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(一)
136 0
【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(二)
【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(二)
119 0
【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
126 0
|
缓存
【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )(二)
【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )(二)
136 0
|
缓存
【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )(一)
【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )(一)
114 0
【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
101 0
|
Java
【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
194 0