Spring Boot通过Guava优雅实现可插拔组件异步通信

文摘   2024-11-25 19:00   新疆  

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)以及 合集全部源码

环境:Spring Boot2.7.18



1. 简介

Guava的 EventBus 允许组件之间以发布-订阅的方式进行通信,而无需组件之间相互显式注册(从而相互知晓)。它专门设计用于替换使用显式注册的传统 Java 进程内事件分发机制。它不是一个通用的发布-订阅系统,也不适用于进程间通信。如下是 EventBus 异步事件处理示例:

// 定义事件监听器public class PackEventListener {  // 监听方法,必须在该方法上使用该注解  // 对应参数你可以自定义  @Subscribe  public void onEvent(Object eventObject) {    System.out.printf("%s, %s%n", Thread.currentThread().getName(), eventObject) ;  }}

有个事件订阅者,接下来就是事件的注册和发布了。

// 创建了异步事件总线,如果你需要同步则可以去掉Async// 这里指定了一个线程池,用来执行异步事件EventBus bus = new AsyncEventBus(Executors.newFixedThreadPool(2)) ;PackEventListener packEventListener = new PackEventListener() ;// 注册事件bus.register(packEventListener) ;// 事件发布bus.post("xxxooo") ;

运行结果

pool-1-thread-1, xxxooo

非常的简单,你还可以通过如下方法来取消注册的事件

PackEventListener packEventListener = new PackEventListener();EventBus bus = ... ;bus.register(packEventListener) ;// ...// 取消注册bus.unregister(packEventListener);

以上是Guava中关于事件的基本使用。接下来我将详细的介绍如果基于Spring Boot实现事件的自动注册与动态取消。

本示例使用如下Guava版本

<dependency>  <groupId>com.google.guava</groupId>  <artifactId>guava</artifactId>  <version>33.3.1-jre</version></dependency>

该版本目前最新的

2. 实战案例

本案例我会通过BeanPostProcessor在创建/销毁 Bean 时自动为事件注册和取消注册对象,而不是通过上面 EventBus 手动的方法注册。 

2.1 自定义全局事件总线

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章