EventBus实现组件间异步

简介: 最近新换了工作,刚来比较轻松,所以想自己写几个小工具提升下自己的效率。在开发过程中发现组件的一些通讯问题,如果采用异步的方式,效率能得到很大提升,所以决定使用到EventBus(消息总线)技术,达到异步事件处理的目的。

1. 背景

最近新换了工作,刚来比较轻松,所以想自己写几个小工具提升下自己的效率。在开发过程中发现组件的一些通讯问题,如果采用异步的方式,效率能得到很大提升,所以决定使用到EventBus(消息总线)技术,达到异步事件处理的目的。

2. EventBus

EventBus是事件总线,事件发送者会将消息发送到总线上,事件订阅者向事件总线订阅和接受事件并进行处理。订阅者不只是可以订阅消息,它同样也可以是消息发送者。

3. 实现方式

3.1 Guava EventBus

Guava EventBus 提供了一个发布-订阅事件机制,该机制允许对象通过观察者模式相互通信,Guava工具中提供的EventBus提供同步和异步两种方式。下面分别看下如何实现。

3.1.1 同步总线(以下代码为代码片段,请酌情使用)

// 创建一个EventBus对象
EventBus logEventBus = new EventBus("log");
EventBus commandEventBus = new EventBus("command");
// 定义两消息类型
@Data
public class EventMessage {
    /**
     * 消息ID
     */
    protected String messageId = UUID.randomUUID().toString();
    /**
     * 消息生成时间
     */
    protected LocalDateTime last = LocalDateTime.now();
}
@Data
@ToString
public class CommandMessage extends EventMessage {
    /**
     * 作用平台
     */
    private PlatformEnum platform;
    /**
     * 命令类型
     */
    private int commandType;
    /**
     * 命令
     */
    private String command;
}
@Data
@ToString
public class LogMessage extends EventMessage {
    /**
     * 日志内容
     */
    private String content;
}
// 定义一个listener类
public class EventListener {
    @Subscribe
    public void listenLogEvent(LogMessage logMessage) {
        System.out.println("EventListener#listenLogEvent ->" + logMessage);
    }
    @Subscribe
    public void listenCommandEvent(CommandMessage commandMessage) {
        System.out.println("EventListener#listenCommandEvent ->" + commandMessage);
    }
}
// 绑定总线并发送消息
LogMessage logMessage = new LogMessage();
logMessage.setContent("我是一个日志消息");
logEventBus.post(logMessage);
CommandMessage commandMessage = new CommandMessage();
commandMessage.setCommand("ipconfig");
commandMessage.setCommandType(1);
commandMessage.setPlatform(PlatformEnum.WINDOWS);
commandEventBus.post(commandMessage);
//  打印结果
EventListener#listenLogEvent ->LogMessage(content=我是一个日志消息)
EventListener#listenCommandEvent ->CommandMessage(platform=WINDOWS, commandType=1, command=ipconfig)

3.1.2 异步总线(以下代码为代码片段,请酌情使用)

// 创建一个EventBus对象
AsyncEventBus logEventBus = new AsyncEventBus("log");
AsyncEventBus commandEventBus = new AsyncEventBus("command");
// 其余代码同同步代码片段,省略...

3.1.3 异常处理

// 可在创建EventBus时创建一个捕获异常的handler
EventBus eventBus = new EventBus((exception, context) -> {
   System.out.println(exception.getCause());
});
相关文章
|
1月前
|
JavaScript
在Vue中,如何使用事件总线来传递数据和触发事件?
在Vue中,如何使用事件总线来传递数据和触发事件?
16 0
|
5月前
|
前端开发 JavaScript
React 中 setState 什么时候是同步的,什么时候是异步的
React 中 setState 什么时候是同步的,什么时候是异步的
55 0
|
7月前
|
前端开发 JavaScript
react的setState是异步还是同步
react的setState是异步还是同步
|
3月前
|
缓存 Java Spring
@EventPublisher + @Async 异步事件流详解
本文主要介绍Spring事件流和`@Async`异步线程池处理,以及`@Async`默认线程池可能会导致的问题及解决方法。 在@Async注解中value参数使用自定义线程池,能让开发工程师更加明确线程池的运行规则,选取适合的线程策略,规避资源耗尽的风险
|
8月前
|
前端开发
react中setState是同步还是异步
react中setState是同步还是异步
70 0
|
10月前
|
JavaScript 前端开发 API
深入理解Vue中的异步更新机制和$nextTick方法
在Vue开发中,我们经常会遇到需要在 DOM 更新完成后执行某些操作的情况。为了解决这个问题,Vue提供了`$nextTick`方法,它可以让我们在下次 DOM 更新完成后执行回调函数。本文将深入探讨Vue的异步更新机制、`$nextTick`的原理和使用场景,以及分别在 Vue2.x 与 Vue3.x 中的相同点和区别。
12476 48
深入理解Vue中的异步更新机制和$nextTick方法
|
JavaScript
Vue(五)——全局事件总线, 消息订阅与发布 ,nextTick
使用事件总线: 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
157 0
Vue(五)——全局事件总线, 消息订阅与发布 ,nextTick
|
缓存 JavaScript 前端开发
vue同步组件和异步组件的区别
vue同步组件和异步组件的区别
|
JavaScript
eventBus的使用场景 -- vue组件通信系列
eventBus的使用场景 -- vue组件通信系列
93 0
|
存储 缓存 前端开发
react 事件机制03-事件注册
本文来说下 react 事件机制的注册过程,在这个过程中主要经过了哪些关键步骤。 文章涉及到的源码是基于 react15.6.1版本,虽然不是最新版本但是也不会影响我们对 react 事件机制的整体把握和理解。 这里都是我自己的理解,不会说非常细节的内容,而是会把大概的流程和原理性的内容进行介绍,做到对整体有个了解。
143 0
react 事件机制03-事件注册