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

Guava EventBus:如何从事件处理程序返回结果

Guava EventBus是一个基于事件驱动的Java库,它用于简化应用程序中的异步编程和事件驱动架构。在回答这个问题之前,请允许我简要介绍一下Guava EventBus以及它的主要概念。

Guava EventBus

Guava EventBus是一个用于构建事件驱动应用程序的Java库。它通过发布事件和注册事件处理程序来处理异步操作。EventBus的主要优点是它简化了事件驱动架构中的异步编程,并有助于保持代码的简洁和可读性。

事件处理程序

事件处理程序是Guava EventBus中处理事件的函数或类。它们被注册到EventBus中,以便在发生特定事件时自动调用。事件处理程序可以处理不同类型的事件,例如HTTP请求、文件更改、数据库更新等。

示例代码

下面是一个简单的Guava EventBus示例代码,用于演示如何使用EventBus处理事件:

代码语言:java
复制
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

public class Main {
  public static void main(String[] args) {
    EventBus eventBus = new EventBus();
    eventBus.register(new MyEventProcessor());

    eventBus.post(new MyEvent());
  }

  private static class MyEventProcessor implements EventBus.Handler {
    @Subscribe
    public void handleMyEvent(MyEvent event) {
      System.out.println("Received MyEvent: " + event.getMessage());
    }
  }

  public static class MyEvent {
    private String message;

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

    public String getMessage() {
      return message;
    }
  }
}

在这个例子中,我们首先创建了一个EventBus实例,并注册了一个MyEventProcessor实例作为事件处理程序。然后,我们通过eventBus.post(new MyEvent())向EventBus发布了一个MyEvent事件。MyEventProcessor实例的handleMyEvent方法被自动调用,处理了这个事件。

从事件处理程序返回结果

虽然Guava EventBus本身不支持直接从事件处理程序返回结果,但是您可以通过将事件处理程序方法标记为@Subscribe(returns = RETURN_CURRENT_VALUE)来返回结果。

代码语言:java
复制
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

public class Main {
  public static void main(String[] args) {
    EventBus eventBus = new EventBus();
    eventBus.register(new MyEventProcessor());

    eventBus.post(new MyEvent("Hello, World!"));
  }

  private static class MyEventProcessor implements EventBus.Handler {
    @Subscribe(returns = RETURN_CURRENT_VALUE)
    public String handleMyEvent(MyEvent event) {
      return event.getMessage();
    }
  }

  public static class MyEvent {
    private String message;

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

    public String getMessage() {
      return message;
    }
  }
}

在这个例子中,我们通过将事件处理程序方法标记为@Subscribe(returns = RETURN_CURRENT_VALUE)来返回结果。当这个方法被调用时,它会将方法的返回值作为事件的message属性返回。

总的来说,Guava EventBus是一个强大的异步编程工具,它简化了事件驱动应用程序的开发,并提供了许多有用的功能。虽然它不能直接从事件处理程序返回结果,但是通过使用@Subscribe(returns = RETURN_CURRENT_VALUE)等注解,您可以轻松地在事件处理程序中返回结果。

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

相关·内容

初探Google Guava

guava在还没做分布式处理上,单机单整合上大行其道。...所以guava程序性能优化上下了不少的工夫,我们称其为单块架构的利器 我认为强大的有几点:1.集合处理   2.EventBus消息总线处理  3.guava cache 单机缓存处理  4.并发listenableFutrue...反射[Reflection] Guava 的 Java 反射机制工具类 1.Guava EventBus探讨 在设计模式中, 有一种叫做发布/订阅模式, 即某事件被发布, 订阅该事件的角色将自动更新。...如何实现 先来讲同步, 即订阅者收到事件后依次执行, 下面都是伪代码, 具体的入库细节等我在这里不提供。...:在多线程运算中可能或者可能在没有结束返回结果,Future是运行中的多线程的一个引用句柄,确保在服务执行返回一个Result。

1.1K20

Java 异步和事件驱动编程:探索响应式模式

本篇博客将深入探讨 Java 中的异步和事件驱动编程概念,并通过实际示例展示如何应用这些技术。Java 中的异步编程1....Callable 和 Future:相比 Runnable,Callable 可以返回结果,Future 提供了一种检查计算是否完成的方式,并能获取结果。2....使用 CompletableFutureCompletableFuture:一个更加强大的异步编程工具,支持流水线执行任务,异常处理结果合并。...使用事件总线事件总线框架:如 Google GuavaEventBus,允许发布和订阅事件,简化事件驱动架构的实现。...通过利用 CompletableFuture 和事件总线,开发者可以有效地处理并发任务和响应系统事件,从而提高应用程序的性能和用户体验。

32921
  • 工具篇:介绍几个好用的guava工具类

    1前言 平时我们都会封装一些处理缓存或其他的小工具。但每个人都封装一次,重复造轮子,有点费时间。有没有一些好的工具库推荐-guava。...BiMap Table(表) Sets和Maps(交并差) EventBus事件) StopWatch(秒表) Files(文件操作) RateLimiter(限流器) Guava Retry(重试...------------- {c=3} {b=(2, 20)} {a=1} {d=4} 8EventBus EventBusGuava事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)...对于事件监听和发布订阅模式 EventBus内部实现原理不复杂,EventBus内部会维护一个Multimap exceptionPredicate) 对异常判断,是否重试 retryIfResult(Predicate resultPredicate) 对返回结果判断

    2.1K11

    Greenrobot-EventBus源码学习(五)

    注册 先贴出注册代码, 可以可到和 Guava 相比没什么大的区别, 主要的点在内部实现上,一个是如何获取注册信息;一个是如何保存注册关系 /** * Registers the given...我们可以倒推一下这个设计思路: 注册,首先是要确定将类的哪些方法注册到 EventBus 排除掉注解方式;还有一种常见的就是我们定义一种方式,可以将我们需要注册的方法直接返回 定义一个接口,用于返回注册类的所有订阅信息...,然后把这个接口也丢给 EventBus 下面贴一个非注解方式的测试用例,方便理解, SubscriberInfoIndex就是我们定义用于返回所有的订阅关系的接口,通过调用 EventBus.addIndex...subscriber, subscribedEvents); } subscribedEvents.add(eventType); // 这里就是对粘性事件处理...,这个使用和guava的有些区别,特别是对超类以及作用域的情况处理 非注解方式注册 典型的借用辅助类(SubscriberInfoIndex)来完成预期目标 此外实现的细节上也可以看看,参考优秀的写法才能提高自己的书写质量

    63560

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

    观察者设计模式大纲如下: 什么是观察者模式 观察者模式代码如何如何使用观察者模式结合业务 Guava EventBus 观察者模式 Spring ApplicationEvent 事件模型 观察者模式最后的总结...这里会分别介绍 Guava#EventBus 以及 Spring#事件模型 同步异步的概念 在介绍 EventBus 和 Spring 事件模型之前,有一道绕不过去的弯,那就是同步执行、异步执行的概念,...总结一句话就是 由调用者主动等待这个调用的结果,未返回之前不执行别的操作 异步执行:而异步执行恰恰相反,发出调用请求后立即返回,并向下执行代码。...一起来看下 Guava 和 Spring 是如何封装观察者模式 Guava EventBus 解析 EventBus 是 Google Guava 提供的消息发布-订阅类库,是设计模式中的观察者模式(生产...Spring 事件Guava EventBus 一样,代码就不粘贴了,都已经存放到 Github 代码仓库。

    1.5K42

    实现领域事件

    这显然返回了 开闭原则。 解决上诉问题的方法很简单,就是使用 领域事件。 领域事件很好理解,说白了就是与领域相关的事件事件的产生往往伴随着相应的动作,例如上面所提到的回复动作。...有了领域事件,每个领域本身就只需要关系其自己的业务逻辑,并在处理完自身逻辑的同时抛出相应的领域事件。对这些领域事件感兴趣的业务方可以 订阅该事件,然后进行后续的处理。...例如 Spring中的事件Guava中的 EventBus都是很好的实践。直接采用这些工具会有两个问题: 无法灵活的处理同步事件和异步事件。...我推荐在 guavaEventBus上面进行封装,因为它已经实现了同步和异步的模式,并且使用注解的订阅方式对程序员也十分友好。 首先,我们需要定义一个 领域事件的抽象基类。 ?...publish(T event) 同步发布事件接口 asyncPublish(T event) 异步发布事件接口 同时,我给出了一个基于 Guava的实现,如下: /** * Guava事件发布器实现

    682100

    google GuavaEventBus

    EventBusGuava事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现,在应用中可以处理一些异步任务。...对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。 ?...DeadEvent 当EventBus发布了一个事件,但是注册的订阅者中没有找到处理事件的方法,那么EventBus就会把该事件包装成一个DeadEvent事件来重新发布;我们在应用中可以提供如下的事件处理方法来处理...之异常处理 在默认情况下,EventBus不会对异常信息进行处理,异常信息也不会终止EventBus的运行,只会简单的打印出异常堆栈信息。...不会对异常信息进行处理,异常信息也不会终止EventBus的运行,只会简单的打印出异常堆栈信息。

    1.3K20

    Guava - EventBus(事件总线)

    Guavaguava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。...不再多的废话,直奔Guava EventBus主题。...首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式。...("%d from int%n", integer); } } Guava发布的事件默认不会处理线程安全的,但我们可以标注@AllowConcurrentEvents来保证其线程安全 发布 对于事件源...DeadEvent DeadEvent暂时不清楚怎么翻译更合意,它描述的是死亡事件,即没有没任何订阅者关心,没有被处理,以DeadEvent类型参数的方法表示.例如在上例中我们post一个Object类型

    1.4K20

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

    routeResult.getSqlStatement().getType(), preparedStatementUnits, getParameters()).executeQuery(); // 对返回结果进行...,接下来一一分析sharding-jdbc如何实现; 单表查询之路由 接下来分析下面这段代码是如何取得路由信息的: Collection preparedStatementUnits...的EventBus发布BEFORE_EXECUTE的事件(执行完成后,如果执行成功还会发布EXECUTE_SUCCESS事件,如果执行失败发布EXECUTE_FAILURE事件),部分核心源码如下: /...(getExecutionEvent(sqlType, baseStatementUnit, each)); } // 调用google-guavaEventBus.post()提交事件 for (AbstractExecutionEvent...merge,下面的sharding-jdbc源码分析系列文章继续对其进行分析; EventBus 说明:EventBus是google-guava提供的消息发布-订阅类库; google-guava

    89630

    EventBus 源码学习笔记(三)

    EventBus 深入学习三之Guava小结 上一篇讲述了 EventBus 的整个执行流程, 本片则从细节处出发,探讨下设计的精妙 巧妙的利用缓存, 解决重复耗时的操作 异步化的操作 队列存储消息,...以及如何避免消息的重复消费 消费的先后顺序 截断 异常处理 1....缓存 看代码时,可以看到很多地方都用到了缓存,如再注册时, 根据class获取所有带注解的方法; 推送消息时,根据事件类型,获取所有的超类集合 如注册时,一条完整的调用链 com.google.common.eventbus.SubscriberRegistry...异常处理 没有订阅者时, 抛一个 DeadEvent 订阅者接收消息后的,执行异常时 (订阅者之间的隔离) 看下具体的执行,比较清晰, 将异常抛给 EventBus的 ExceptionHandler...消费顺序 & 截断 GuavaEventBus不支持定义订阅者的顺序,更谈不上截断

    1.1K60

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

    Guava中常用到的工具类学了一遍,感觉有些工具类还是挺有用的,至少它帮你封装了很多功能,让你在处理一些逻辑的时候,不用太关注细节,把Guava的工具类直接拿来用就好了。...查找value,通过value来查找值,也就是需要一个双向Map,如果使用JDK中的Map,我们需要维护两个Map,一个key映射到value,另外一个value映射到key,而且不管是新增还是修改...》 7、Guava发布/订阅EventBus EventBusGuava中实现的用于发布/订阅模式的事件处理组件,它是设计模式中观察者模式的优雅实现 EventBus是消息总线,它会根据消息的类型发送到指定的消息订阅者...,当有消息没有订阅者接收时,会将消息发送给DeadEvent 关于EventBus的详细用法,请查看《Guava系列之EventBus》 ---- 以上是对最近学习Guava类库的一个总结,它包括了我们平常开发中最常用的一些组件工具类...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/200846.html原文链接:https://javaforall.cn

    1.8K10

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

    传统JDK中的Future通过异步的方式计算返回结果:在多线程运算中可能或者可能在没有结束返回结果,Future是运行中的多线程的一个引用句柄,确保在服务执行返回一个Result。...ListenableFuture#get() 当所有任务都成功时,返回所有任务执行结果;当任何一个任务失败时,马上抛出异常,无需等待其他任务执行完成。 为什么会分同步执行和异步执行呢?...* * @param baseStatementUnit 语句对象执行单元 * @return 处理结果 * @throws Exception 执行期异常...Sharding-JDBC 使用 Guava(没错,又是它)的 EventBus 实现了事件的发布和订阅。...例如, #listen() 订阅了 DMLExecutionEvent 事件 EventBus#post() 发布事件,同步调用订阅逻辑 ?

    1.2K70

    设计模式之观察者模式及典型应用

    本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托事件模型...EventBus 中的观察者模式 Guava 中的 EventBus 封装了友好的 "生产/消费模型",通过非常简单的方式,实现了观察者模式中的监听注册,事件分发。...EventBus 的更多用法可自行查看相关文档 Guava EventBus 源码分析可看这篇 http://t.cn/EZzC35B JDK 委托事件模型DEM中的观察者模式 首先来敲一个AWT...也就是我们实现的匿名事件处理类),实现对事件处理 动作事件发生 1 次 动作事件发生 2 次 动作事件发生 3 次 动作事件发生 4 次 Spring ApplicationContext 事件机制中的观察者模式...spring的事件机制是java的事件机制拓展而来,ApplicationContext 中事件处理是由 ApplicationEvent 类和 ApplicationListener 接口来提供的

    1.1K70

    EventBus原理深度解析(Guava

    eventbus主要有以下几部分组成: 1、eventbus、asyncEventBus:事件发送器。 2、event:事件承载单元。...3、事件发送:执行指定事件类型的订阅者(包含了method),订阅者中获取指定事件的订阅者,然后按照规则(同步、异步)执行指定的方法。 ? 上述代码说明,如果事件没有监听者,就当作死亡事件来对待。...4、EventBus与AsyncEventBus的区别 字面上看,AsyncEventBus是异步的EventBus,那么EventBus应该就是同步的了。...即如果订阅者方法上有注解AllowConcurrentEvents,则返回Subscriber,否则,返回SynchronizedSubscriber。...2、本文用到的guava版本如下: ? 作者:yangjianzhou https://my.oschina.net/yangjianzhou/blog/2208677 【推荐阅读】

    4.4K31

    EventBus源码学习笔记(一)

    EventBus 深入学习一 EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程; 传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的...,但是设计非常巧妙 订阅者角度来看,首先是要注册,没什么好说的,关键点就在于接受消息的处理方法上 - 添加一个注解,指定消息接收类型(即参数类型), 就可以接受这类消息 - 基于上面的方法,一个订阅者...事件监听者(Listeners) 即我们上面的订阅者,最终接受事件,并执行响应的业务逻辑的主体 在EventBus实例上调用EventBus.register(Object)方法注册事件监听者;需要注意的是请保证事件生产者和监听者共享相同的...事件生产者(Producers) 发送事件的主体,通过把事件传递给 EventBus.post(Object)方法。异步分发可以直接用EventBus的子类AsyncEventBus。 3....术语 术语 说明 事件 可以向事件总线发布的对象 订阅 向事件总线注册监听者以接受事件的行为 监听者 提供一个处理方法,希望接受和处理事件的对象 处理方法 监听者提供的公共方法,事件总线使用该方法向监听者发送事件

    83050
    领券