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定义)

/**
 * @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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/358110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构 01】栈

一、原理 栈通常从数据结构和内存空间两个角度解释&#xff0c;从数据结构的角度&#xff0c;栈是一种线性结构表&#xff0c;只允许在固定的一端进行插入和删除元素&#xff0c;从内存空间角度&#xff0c;操作系统为函数和变量分配的内存空间通常在栈区&#xff0c;但是无论…

状态码400以及状态码415

首先检查前端传递的参数是放在header里边还是放在body里边。 此图前端传参post请求&#xff0c;定义为’Content-Type’&#xff1a;‘application/x-www-form-urlencoded’ 此刻他的参数在FormData中。看下图 后端接参数应为&#xff08;此刻参数前边什么都不加默认为requestP…

基于Vue uniapp和java SpringBoot的汽车充电桩微信小程序

摘要&#xff1a; 随着新能源汽车市场的迅猛发展&#xff0c;汽车充电桩的需求日益增长。为了满足市场需求&#xff0c;本课题开发了一款基于Java SpringBoot后端框架和Vue uniapp前端框架的汽车充电桩微信小程序。该小程序旨在为用户提供一个简洁高效的充电服务平台&#xff0…

321倒计时素材视频在哪找?试试这4个软件

321倒计时素材视频在哪找&#xff1f;在这个信息爆炸的时代&#xff0c;视频素材在各种媒体平台上的需求日益增长。而倒计时视频素材作为其中一种&#xff0c;更是因其独特的功能和效果&#xff0c;被广泛应用于各种场景。那么&#xff0c;哪些软件提供倒计时视频素材呢&#x…

su模型库免费下载哪家好?

选择SU模型库免费下载的网站&#xff0c;需要根据个人的需求和偏好进行评估。以下是一些热门的SU模型库免费下载网站&#xff0c;供您参考&#xff1a; ①建e网&#xff1a;这是一个专业的室内设计资源平台&#xff0c;包括各种类型的SU模型&#xff0c;如家装、公装、商业空间…

echarts:获取省、市、区/县、镇的地图数据

目录 第一章 前言 第二章 获取地图的数据&#xff08;GeoJSON格式&#xff09; 2.1 获取省、市、区/县地图数据 2.2 获取乡/镇/街道地图数据 第一章 前言 需求&#xff1a;接到要做大屏的需求&#xff0c;其中需要用echarts绘画一个地图&#xff0c;但是需要的地图是区/县…

【测试运维】接口测试各知识md文档学习笔记第1篇(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论接口测试相关知识。目标&#xff1a;了解接口测试服务对象&#xff0c;基本作用&#xff0c;接口测试环境插件工具&#xff0c;掌握jmeter的使用&#xff0c;掌握接口测试的测试用例编写。熟悉Jmeter工具组成&#xff0…

【粉丝答疑(1)】使用LDRA Testbed(TBrun)进行单元测试编译时报自定义的数据类型错误_问题排查及解决

前言 最近有粉丝在后台提问&#xff0c;咨询使用Testbed&#xff08;TBrun&#xff09;进行单元动态测试时报错的问题。这个问题比较常见&#xff0c;于是想着写下本篇文章&#xff0c;希望对遇到类似问题的朋友有所帮助。 问题描述 事情的经过大概是这样子的&#xff1a; …

GC8838取代DRV8838直流电机驱动芯片,可应用在摄像机,玩具等产品上

GC8838 一款 12V 直流电机驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。芯片一般用了驱动一个直流电机或者使用两颗来驱动步进电机。 可以工作在 0~12V 的电源电压上&#xff0c;能提供高达 1.5A 持续…

智慧文旅:未来旅游业的数字化转型

随着科技的快速发展&#xff0c;数字化转型已经成为各行各业的必然趋势。旅游业作为全球经济的重要组成部分&#xff0c;也正经历着前所未有的变革。智慧文旅作为数字化转型的重要领域&#xff0c;正逐渐改变着旅游业的传统模式&#xff0c;为游客带来更加便捷、个性化的旅游体…

小项目:使用MQTT上传温湿度到Onenet服务器

前言 我们之前分别编写了 DHT11、ESP8266 和 MQTT 的代码&#xff0c;现在我们将它们仨整合在一起&#xff0c;来做一个温湿度检测小项目。这个项目可以实时地将 DHT11 传感器获取到的温湿度数据上传到 OneNET 平台。通过登录 OneNET&#xff0c;我们随时随地可以查看温湿度数…

macOS与Linux相互投屏的方法

很多人面对跨系统投屏都望而却步。其实只要找对方法&#xff0c;两台不同系统的电脑也可以相互投屏。 今天就来看看Linux系统和macOS系统如何相互投屏&#xff01; 第一步&#xff0c;将Linux系统电脑和macOS系统电脑连接同一网络。假设是macOS系统投屏到Linux系统&#xff0c;…

javaweb项目,springboot幼儿园健康管理系统,界面美观,增删改查。

javaweb项目&#xff0c;幼儿园健康管理系统&#xff0c;界面美观&#xff0c;增删改查。 管理员&#xff0c;老师&#xff0c;学生三个角色。 功能&#xff1a;权限管理&#xff0c;咨询列表&#xff0c;教师列表&#xff0c;班级列表&#xff0c;健康档案列表&#xff0c;评…

使用QT实现播放gstreamer的命令(二)

一、前言 上一篇文章写到了&#xff0c;如何快速使用C来执行gstreamer的命令&#xff0c;如何在QT中显示gstreamer的画面&#xff0c;原文如下&#xff1a; https://blog.csdn.net/Alon1787/article/details/135107958 二、近期的其他发现&#xff1a; 1.gstreamer的画面显示在…

代码训练营Day.48 | 198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III

198. 打家劫舍 1. LeetCode链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2. 题目描述 3. 解法 可以看作一个01背包问题。背包容量为所有房子中存储的金钱总数。 1. dp数组含义&#xff1a;dp[i][j]表示前i个房子在背包容量为j的情况下可以…

Arrays.asList()方法调用add()或remove()抛出java.lang.UnsupportedOperationException问题

在使用Arrays.asList方法将以,分割的字符串转为list集合时&#xff0c;调用add和remove等方法时会抛出java.lang.UnsupportedOperationException。以下为原因和解决方法。 原因&#xff1a; Arrays.asList()方法返回了一个Arrays类的一个继承了AbstractList的ArrayList内部类…

Python面向对象-类专题

在Python中&#xff0c;if __name__ __main__: 这一句是一个常见的模式&#xff0c;用于判断当前的模块是被直接运行还是被导入到其他模块中。 当Python文件被直接运行时&#xff0c;其内置的__name__变量被设置为__main__。但如果这个文件被其他文件导入&#xff0c;__name__…

面向云服务的GaussDB全密态数据库

前言 全密态数据库&#xff0c;顾名思义与大家所理解的流数据库、图数据库一样&#xff0c;就是专门处理密文数据的数据库系统。数据以加密形态存储在数据库服务器中&#xff0c;数据库支持对密文数据的检索与计算&#xff0c;而与查询任务相关的词法解析、语法解析、执行计划生…

海外云手机为什么吸引用户?

近年来&#xff0c;随着全球化的飞速发展&#xff0c;海外云手机逐渐成为各行各业关注的焦点。那么&#xff0c;究竟是什么让海外云手机如此吸引用户呢&#xff1f;本文将深入探讨海外云手机的三大吸引力&#xff0c;揭示海外云手机的优势所在。 1. 高效的社交媒体运营 海外云…

盒子模型的内容总结

知识引入 1.认识盒子模型 在浏览网站时我们会发现内容都是按照区域划分的。这使得网页很工整、美观。在页面中&#xff0c;每一块区域分别承载不同的内容&#xff0c;使得网页的内容虽然零散&#xff0c;但是在版式排列上依然清晰有条理。如图1 图1 *承载内容的区域称为盒子…