Guava EventBus详解

概述

EventBus顾名思义,事件总线,是一个轻量级的发布-订阅模式的应用模式。相比于MQ更加简洁,轻量,它可以在一个小系统模块内部使用。

EventBus允许组件之间通过发布-订阅进行通信,而不需要组件之间显示的注册。它专门设计为了代替显示注册的传统的Java进程内事件分发。它不是通用的发布-订阅系统,也不是用于进程间通信的。

应用场景:进程内部通信,不能用于分布式场景,分布式场景请使用MQ。

EventBus介绍

EventBus是google的Guava库中的一个处理组件间通信的事件总线,它基于发布/订阅模式,实现了多组件之间通信的解耦合,事件生产方和事件消费方实现解耦分离,提升了通行的简介性。

当一个事件的发送(事件生产方),需要触发很多事件消费方的时候,我们通常会在事件产生方中,分别的去调用那些事件消费方,这样比较繁琐、复杂,业务也不清晰。事件的产生方与事件的消费方,产生的极大的耦合,如果我们要改动某一个事件消费方,很可能要改动事件的产生方。

使用场景

在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个 jvm 里面通知的话,就可以使用EventBus。由于EventBus使用起来简单、便捷,因此,工作中会经常用到。

事件总线三要素

事件(Event)

事件是EventBus之间相互通信的基本单位,一个Event可以是任何类型。一般会定义特定的事件类,类名以Event作为后缀,里面定义一些变量或者函数等。

发布者(Publisher)

事件发布者,就是发送事件到EventBus事件总线的一方,事件发布者调用Post()方法,将事件发给EventBus。可以在程序的任何地方,调用EventBus的post()方法,发送事件给EventBus。

订阅者(Subscriber)

事件订阅者,就是接收事件的一方,这些订阅者需要在自己的方法上,添加@Subscribe注解声明自己为事件订阅者。不过只声明是不够的,还需要将自己所在的类,注册到EventBus中,EventBus才能扫描到这个订阅者。

EventBus示例

guava依赖

EventBusConfig配置(eventbus定义)

java 复制代码
/**
 * @date 2022/7/14 10:45
 * @desc 事件总线配置
 */
@Configuration
public class EventBusConfig {

	@Bean
	public AsyncEventBus asyncEventBus() {
		int corePoolSize = Runtime.getRuntime().availableProcessors();
		int maxPoolSize = 100;
		int keepAliveTime = 60 * 1000;

		BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(5000);
		RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
		ThreadFactory factory = new ThreadFactory() {
			private final AtomicInteger integer = new AtomicInteger(1);

			@Override
			public Thread newThread(@Nonnull Runnable r) {
				return new Thread(r, "TheadPool-Thread-" + integer.getAndIncrement());
			}
		};

		return new AsyncEventBus(new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, factory, handler));
	}
}

注册监听器与事件发送

订阅者

注意事项

1、在高并发的环境下使用AsyncEventBus时,发送事件可能会出现异常,因为它使用的线程池,当线程池的线程不够用时,会拒绝接收任务,就会执行线程池的拒绝策略,如果需要关注是否提交事件成功,就需要将线程池的拒绝策略设为抛出异常,并且try-catch来捕获异常。

参考

事件总线 EventBus

EventBus原理深度解析(Guava)

相关推荐
徐寿春9 天前
什么是数据倾斜
java·guava
QuZero11 天前
Guava Cache Deep Dive
java·后端·算法·guava
西凉的悲伤12 天前
Guava类库——Range连续区间
java·算法·guava
拼尽全力前进15 天前
Guava Cache vs Caffeine 面试详解
面试·职场和发展·guava
大梦谁先觉i21 天前
Milvus 向量数据库:原理详解、离线部署、可视化配置与全套实操教程
transformer·guava
水无痕simon1 个月前
1. Guava 介绍
开发语言·python·guava
JAVA面经实录9172 个月前
如何选择适合项目的「限流 / 熔断 / 降级」方案
java·spring·kafka·sentinel·guava
ai旅人2 个月前
Guava RateLimiter深度解析:非阻塞令牌桶限流原理与跑批实战
java·限流·guava
西凉的悲伤2 个月前
Guava类库——Lists.partition() 高效分批处理列表数据
java·guava
伯恩bourne3 个月前
Google Guava:Java 核心工具库的卓越之选
java·开发语言·guava