首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Guava EventBus从不同线程发布事件

Guava EventBus是Google开发的一个事件总线库,用于在应用程序的不同组件之间进行解耦的事件通信。它提供了一种简单而强大的机制,使得不同线程之间的事件发布和订阅变得更加容易和高效。

事件总线模式是一种常见的软件设计模式,用于实现发布-订阅机制。通过使用事件总线,不同组件可以通过发布和订阅事件来进行通信,而不需要直接依赖或了解彼此的存在。这种松耦合的通信方式可以提高代码的可维护性和可扩展性。

使用Guava EventBus从不同线程发布事件的步骤如下:

  1. 创建事件类:首先,你需要定义一个事件类,用于封装需要传递的数据。事件类可以是任何普通的Java类,但通常应该包含一些有意义的数据字段。
  2. 注册订阅者:在需要接收事件的组件中,你需要注册一个订阅者。订阅者是一个普通的Java类,其中包含用于处理特定事件的方法。通过使用Guava EventBus提供的@Subscribe注解,你可以将订阅者的方法与特定类型的事件进行关联。
  3. 创建事件总线:在应用程序的适当位置,你需要创建一个事件总线实例。可以使用EventBus类的构造函数来创建一个新的事件总线对象。
  4. 发布事件:当你想要发布一个事件时,可以通过调用事件总线对象的post()方法来实现。该方法会将事件发送到所有已注册的订阅者。

下面是使用Guava EventBus的示例代码:

代码语言:txt
复制
// 步骤1:定义事件类
public class MyEvent {
    private String message;

    public MyEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

// 步骤2:创建订阅者
public class MySubscriber {
    @Subscribe
    public void handleEvent(MyEvent event) {
        System.out.println("Received event: " + event.getMessage());
    }
}

// 步骤3:创建事件总线
EventBus eventBus = new EventBus();

// 步骤4:注册订阅者
MySubscriber subscriber = new MySubscriber();
eventBus.register(subscriber);

// 步骤5:发布事件
eventBus.post(new MyEvent("Hello, EventBus!"));

在上面的示例中,我们定义了一个名为MyEvent的事件类,并创建了一个名为MySubscriber的订阅者。然后,我们创建了一个事件总线对象,并将订阅者注册到该事件总线上。最后,我们通过调用post()方法发布了一个MyEvent类型的事件。

Guava EventBus的优势和应用场景如下:

优势:

  • 解耦性:使用事件总线可以将应用程序的不同组件解耦,使得它们之间的通信更加简单和灵活。
  • 线程安全:Guava EventBus提供了线程安全的事件发布和订阅机制,可以在多线程环境下安全地使用。
  • 简单易用:Guava EventBus的API设计简单易用,上手成本低,适用于各种规模的应用程序。

应用场景:

  • 异步通信:如果你的应用程序需要在不同线程之间进行异步通信,使用Guava EventBus可以简化线程间的消息传递。
  • 模块解耦:当你的应用程序由多个模块组成,并且需要进行模块间的解耦时,使用事件总线可以降低模块之间的耦合度。
  • 插件系统:如果你正在开发一个插件化的系统,使用事件总线可以方便地实现插件间的通信和扩展。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云消息队列 CMQ:https://cloud.tencent.com/product/cmq
  • 腾讯云云函数 SCF:https://cloud.tencent.com/product/scf
  • 腾讯云容器服务 TKE:https://cloud.tencent.com/product/tke

请注意,以上推荐的腾讯云产品仅供参考,你可以根据实际需求选择适合的产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JAVA | Guava EventBus 使用 发布订阅模式

同步使用 3. 异步使用 4. 异常处理 总结 参考 --- 前言 EventBusGuava事件处理机制,是观察者模式(生产/消费模型)的一种实现。...创建一个订阅者 在 Guava EventBus 中,是根据参数类型进行订阅,每个订阅的方法只能由一个参数,同时需要使用 @Subscribe 标识 class EventListener { /...注册到 EventBus 上并发布消息 EventBus eventBus = new EventBus(); eventBus.register(new EventListener()); eventBus.post...Guava Event 实际上是使用线程池来处理订阅消息的,通过源码可以看出,当我们使用默认的构造方法创建 EventBus 的时候,其中 executor 为 MoreExecutors.directExecutor...异步使用 通过上面的源码,可以看出只要将构造方法中的 executor 换成一个线程池实现即可, 同时 Guava EventBus 为了简化操作,提供了一个简化的方案即 AsyncEventBus EventBus

7.4K10

EventBus事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

文章目录 前言 一、根据不同的线程模式进行不同的线程切换操作 二、完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅方法的...MAIN , 则需要判定发布线程是否是主线程 ; 如果发布线程是主线程 , 则直接执行订阅方法 ; 如果发布线程不是主线程 , 则需要在主线程中执行订阅方法 ; 假如订阅方法的线程模式属性是 BACKGROUND..., 则需要判定发布线程是否是主线程 ; 如果发布线程是主线程 , 则切换到子线程执行订阅方法 ; 如果发布线程不是主线程 , 则直接执行订阅方法 ; 可参考 【Android 异步操作】Android..., 判定发布线程是否是主线程 ; 如果发布线程是主线程 , 则切换到子线程执行订阅方法 ; 如果发布线程不是主线程 , 则直接执行订阅方法 ; 为了方便 , 这里将 ASYNC 与 BACKGROUND...>, List> METHOD_CACHE = new HashMap(); /** * 解除注册时使用 * Key

57410

Guava - EventBus(事件总线)

Guavaguava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。...首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式。...下面将以EventBus为例,AsyncEventBus使用方式与其一致的。...("%d from int%n", integer); } } Guava发布事件默认不会处理线程安全的,但我们可以标注@AllowConcurrentEvents来保证其线程安全 发布 对于事件源...正在这里对于Guava对于事件发布,是依据上例中订阅方法的方法参数类型决定的,换而言之就是post传入的类型和其基类类型可以收到此事件

1.4K20

初探Google Guava

事件总线[EventBus] 发布-订阅模式的组件通信,但组件不需要显式地注册到其他组件中 12. 数学运算[Math] 优化的、充分测试的数学工具类 13. ...反射[Reflection] Guava 的 Java 反射机制工具类 1.Guava EventBus探讨 在设计模式中, 有一种叫做发布/订阅模式, 即某事件发布, 订阅该事件的角色将自动更新。...1, 订阅者订阅了这个 而加入eventBus发布者与生产者之间的耦合性就降低了。...当数据事件触发, 发布到data EventBus 上, 入库和预警分别订阅这个eventBus, 就会触发这两个事件, 而在预警事件中, 将事件发送到warning EventBus 中, 由下列3个订阅的客户端进行发送消息...super V> callback)),默认是采用 MoreExecutors.sameThreadExecutor()线程池, 为了简化使用,Callback采用轻量级的设计.

1K20

实现领域事件

例如 Spring中的事件Guava中的 EventBus都是很好的实践。直接采用这些工具会有两个问题: 无法灵活的处理同步事件和异步事件。...EventBus是支持同步和异步两种模式的,但是它要求在初始化时就指定好事件是 同步的还是 异步的,这对于使用方不够灵活。 订阅方无法控制事件的订阅与取消。...我推荐在 guavaEventBus上面进行封装,因为它已经实现了同步和异步的模式,并且使用注解的订阅方式对程序员也十分友好。 首先,我们需要定义一个 领域事件的抽象基类。 ?...publish(T event) 同步发布事件接口 asyncPublish(T event) 异步发布事件接口 同时,我给出了一个基于 Guava的实现,如下: /** * Guava事件发布器实现...其中我将异步线程池硬编码为1个线程,基本满足大部分情况,也可酌情修改或者开放这个参数,有各个领域事件发布器来实现。

659100

异步化执行线程隔离的点滴记录 | 闪念N0.1

Guava EventBus来完成 今天脑海中闪过GuavaEventBus,所以,也写了一个处理方法,记录一下: 定义线程池,模拟核心和非核心线程池 定义抽线的核心和非核心监听器 将核心监听器注器到核心...核心 非核心 定义事件 模拟一个慢SQL事件 定义一个事件发送中心(非必要) 将核心和非核心线程池封装起来,提供postCoreEvent和postCommonEvent方法 至此,我们完成...EventBus线程池、监听器和事件定义,一个发布 / 订阅的示例就完成了。...接下来,我们就来使用它来模拟使用核心和非核心线程池发送慢SQL事件。...示例 //只要注入事件发布中心Component@Autowiredprivate EventBusPostCenter eventBusPostCenter; //核心线程使用eventBusPostCenter.postCoreEvent

39040

Java两大工具库:Commons和Guava(6)

除了操作集合、限流和缓存,Guava还有另一个隐秘的功能:事件总线EventBus机制——是发布-订阅模式的实现,不需要显式地注册回调——比观察者模式更灵活。...EventBus是在单体架构内实现松耦合的一种很好的手段,通过它可以实现与业务逻辑无关的事件监听和消费。...Guava提供的事件总线EventBus分为两种:1、同步事件EventBus,主要用于单线程环境;2、异步事件AsyncEventBus,主要用于多线程环境。可以稍稍回顾一下观察者模式。...在支付系统的设计模式中,当完成交易后,需要给用户发送通知时就使用到了观察者模式,怎么做的呢?...既然用观察者模式实现比较麻烦,那不妨换个思路,用Guava EventBus来实现,而且无需继承任何接口。调用、发送回调通知同样也很简单,用EventBus把支付回调再来实现一遍。

32840

【死磕Sharding-jdbc】---路由&执行

google-guava封装的线程池,设置了线程名称为增加了ShardingJDBC-***,增加了shutdown hook--应用关闭时最多等待60秒直到所有任务完成,从而实现优雅停机 executorService...的EventBus发布BEFORE_EXECUTE的事件(执行完成后,如果执行成功还会发布EXECUTE_SUCCESS事件,如果执行失败发布EXECUTE_FAILURE事件),部分核心源码如下: /.../ 发布事件 List events = new LinkedList(); if (parameterSets.isEmpty()) { /...(getExecutionEvent(sqlType, baseStatementUnit, each)); } // 调用google-guavaEventBus.post()提交事件 for (AbstractExecutionEvent...说明:EventBus是google-guava提供的消息发布-订阅类库; google-guavaEventBus正确打开姿势: 发布事务:调用EventBus的post()–sharding-jdbc

87030

【吐血整理】想学Google Guava看这篇就够了「建议收藏」

,只能读 支持多个线程调用,不存在竞争的问题,天然支持多线程 不可变集合节省内存空间,因为不可变,集合空间在创建时就已经确定好了,不用考虑扩容等问题,内存利用率高 不可变集合可用于常量 Guava针对常用的集合类型...Guava Cache的详细使用方法,可查看《Guava系列之Cache》 5、Guava强大的String工具类 String是我们平时开发工作当中使用最频繁的类型, Guava提供了字符串的连接、...》 7、Guava发布/订阅EventBus EventBusGuava中实现的用于发布/订阅模式的事件处理组件,它是设计模式中观察者模式的优雅实现 EventBus是消息总线,它会根据消息的类型发送到指定的消息订阅者...,当有消息没有订阅者接收时,会将消息发送给DeadEvent 关于EventBus的详细用法,请查看《Guava系列之EventBus》 ---- 以上是对最近学习Guava类库的一个总结,它包括了我们平常开发中最常用的一些组件工具类...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/200846.html原文链接:https://javaforall.cn

1.4K10

【死磕【Sharding-jdbc】---EventBus-轻量级进程内事件分发组件

EventBus来自于google-guava包中。...翻译:将事件分派给监听器,并为监听器提供注册自己的方法。EventBus允许组件之间的发布 - 订阅式通信,而不需要组件彼此明确注册(并且因此彼此意识到)。...它专门用于使用显式注册替换传统的Java进程内事件分发。 它不是一个通用的发布 - 订阅系统,也不是用于进程间通信。...使用参考 关于EventBus的用例代码提取自sharding-jdbc源码,并结合lombok最大限度的简化: EventBusInstance--用于获取EventBus实例(饿汉式单例模式) @NoArgsConstructor...guava自定义数据结构,类似Map>,key就是事件类型,例如DMLExecutionEvent,value就是EventSubscriber即事件订阅者集合(说明,

59720

美团二面:如何优雅使用观察者模式

观察者设计模式大纲如下: 什么是观察者模式 观察者模式代码如何写 如何使用观察者模式结合业务 Guava EventBus 观察者模式 Spring ApplicationEvent 事件模型 观察者模式最后的总结...什么是观察者模式 观察者模式 是一种行为设计模式,允许定义一种订阅通知机制,可以在对象(被观察者)事件发生时通知多个 “观察” 该对象的观察者对象,所以也被称为 发布订阅模式 其实我个人而言,不太喜欢使用文字去定义一种设计模式的语义...这里会分别介绍 Guava#EventBus 以及 Spring#事件模型 同步异步的概念 在介绍 EventBus 和 Spring 事件模型之前,有一道绕不过去的弯,那就是同步执行、异步执行的概念,...一起来看下 Guava 和 Spring 是如何封装观察者模式 Guava EventBus 解析 EventBus 是 Google Guava 提供的消息发布-订阅类库,是设计模式中的观察者模式(生产...Spring 事件Guava EventBus 一样,代码就不粘贴了,都已经存放到 Github 代码仓库。

1.4K42

google GuavaEventBus

EventBusGuava事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现,在应用中可以处理一些异步任务。...对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。 ?...the int event."); eventBus.post(1000); } } 结论:注册了一个Listener,使用eventBus发送消息它的父类的Subscribe...结论:当作为参数的event之间有继承关系时,使用eventBus发送消息,eventt的父类listener也会对此消息进行处理。...DeadEvent 当EventBus发布了一个事件,但是注册的订阅者中没有找到处理该事件的方法,那么EventBus就会把该事件包装成一个DeadEvent事件来重新发布;我们在应用中可以提供如下的事件处理方法来处理

1.3K20

EventBus源码学习笔记(一)

EventBus 深入学习一 EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程; 传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的...使用非常简单, 创建一个 EventBus 实例, 订阅方,调用 EventBus.register() 方法注册, 消息发布方,调用eventBus.post(event); 来发布消息, 则订阅类中...中的 EventBus 来作为研究对象; 后续会对比下android平台上使用非常多的greenrobot/EventBus 从上面的使用可以简单的看出EventBus的设计思路基本上还是 消息-订阅的模子...,直接调用 EventBus.post() 就算是发布消息,使用起来超级简单 其中 EventBus 作为沟通的桥梁,也就是上面我们说的‘储钱罐’, 如果希冀实现异步的消息处理,则直接用AsyncEventBus...术语 术语 说明 事件 可以向事件总线发布的对象 订阅 向事件总线注册监听者以接受事件的行为 监听者 提供一个处理方法,希望接受和处理事件的对象 处理方法 监听者提供的公共方法,事件总线使用该方法向监听者发送事件

80550

数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 执行

数据库连接池实现的 Connection 不一定是线程安全,例如 Druid 的线程池 Connection 非线程安全 ExecutionEvent 这里先不解释,在本文第四节【EventBus】分享...Sharding-JDBC 使用 Guava(没错,又是它)的 EventBus 实现了事件发布和订阅。...从上文 ExecutorEngine#executeInternal() 我们可以看到每个分片 SQL 执行的过程中会发布相应事件: 执行 SQL 前:发布类型类型为 BEFORE_EXECUTE 的事件...执行 SQL 成功:发布类型类型为 EXECUTE_SUCCESS 的事件 执行 SQL 失败:发布类型类型为 EXECUTE_FAILURE 的事件 怎么订阅事件呢?...例如, #listen() 订阅了 DMLExecutionEvent 事件 EventBus#post() 发布事件,同步调用订阅逻辑 ?

1.1K70

观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?

针对这个业务场景,最开始的想法是尽量少的侵入原有业务方法,所以这里选择使用观察者模式。 原有业务场景中加入发布事件的能力,然后订阅者自己消费进行埋点数据逻辑。做到尽可能的业务解耦。...业务代码示例 这里使用的是Guava中自带的EventBus组件,我们继续用取消订单业务场景做示例,这里抽离了部分代码,只展示核心的一些代码: 1....发布事件源码实现 com.google.common.eventbus.EventBus#post public void post(Object event) {     //获取事件的订阅者集合     ...我们使用的是AsyncEventBus,其中指定的事件转发器是:LegacyAsyncDispatcher,接着看看其中的dispatch()方法的实现: com.google.common.eventbus.Dispatcher.LegacyAsyncDispatcher...总结 这里主要是整理了guava 中实现观察者模式的使用及原理。 大家如果有类似的业务场景也可以使用到自己项目中。

1K10
领券