目录
SSE(Server-Sent Events)是指服务器发送事件,这是一种浏览器 API,允许服务器端向客户端持续推送数据,而无需客户端发起请求。
比如在社交媒体更新、新闻直播、股票市场、物联网智能设备等等方面,如下图。如果数据发生了更新,更新的数据能实时高效的推送给客户端就显的尤为重要。传统的方式是客户端需要去主动获取数据的变化,但是这种事不实时的,效率低,而且浪费资源。
相比于 WebSocket,SSE 比较简单,基于 HTTP 协议,易于理解,但是 SSE 也有一个天然的不足,那就是无法定向推送数据,推送数据时广播的模式,所有的客户端都能收到。
一、EventBus 简介
EventBus 是一个广泛应用于开发中的轻量级事件发布/订阅框架,它的核心设计理念是简化应用程序内部各组件间的通信。通过采用发布/订阅(Publish/Subscribe)设计模式,EventBus能够有效地降低组件之间的耦合度,提高代码可读性和维护性。
1.1 EventBus 工作流程
EventBus 的工作流程如下:
- 定义事件(Event):首先,需要自定义事件类,这个类可以封装任何类型的数据,比如行为数据、数据更新或者其他需要传递的信息。
- 注册订阅者(Subscriber Registration):使用注解 @Subscribe 标记订阅者类中的某个方法,表示该方法想要接收某种类型的事件。在初始化阶段,需要讲订阅者注册到 EventBus 中,这样 EventBus 就能知道哪些对象对何种事件感兴趣。
- 发布事件(Post):当有事件需要传递时,发布者通过调用 post 方法,将事件发布到 EventBus 上。
- 事件分发(Dispatching):EventBus 收到事件后,会根据事件类型找到所有注册了该事件类型处理方法的订阅者。根据事件订阅时指定的线程模式,EventBus 会选择合适的线程执行订阅者的方法。线程模型如下:
POSTING
:事件处理在发布事件所在线程中执行。MAIN
:如果不在主线程,则切换到主线程执行事件处理。MAIN_ORDERED
:类似MAIN
,但在主线程中按照事件发布的顺序逐个执行。BACKGROUND
:如果不在后台线程,则新建一个后台线程执行。ASYNC
:无论在哪种线程环境下,都会在独立的线程池中异步执行。
- 执行订阅者方法:EventBus 通过反射调用订阅者中对应注解的方法,并将发布的事件对象作为参数传递给该方法。
二、SSE 基于 EventBus 实现定向推送
由于 SSE 只能实现广播模式的消息推送,如果要实现推送数据到指定的客户端,就需要做一些改动,加入有这么一个场景,