在Google Guava 10版本引入了EventBus, 它主要用来简化我们处理生产/消费者编程模型.
基本用法
使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可:
public class EventListener {
public int lastMessage = 0;
@Subscribe
public void listen(OurTestEvent event) {
lastMessage = event.getMessage();
}
public int getLastMessage() {
return lastMessage;
}
}
上面的lastMessage用来接收消息.
下面定义的类用来对消息进行封装:
public class OurTestEvent {
private final int message;
public OurTestEvent(int message) {
this.message = message;
}
public int getMessage() {
return message;
}
}
通过写一个测试来了解EventBus如何工作:
@Test
public void shouldReceiveEvent() throws Exception {
// given
EventBus eventBus = new EventBus("test");
EventListener listener = new EventListener();
eventBus.register(listener);
// when
eventBus.post(new OurTestEvent(200));
// then
assertThat(listener.getLastMessage()).isEqualTo(200);
}
上面的测试是不是很简单?
MultiListener的使用
只需要在要订阅消息的方法上加上@Subscribe注解即可实现对多个消息的订阅:
public class MultipleListener {
public Integer lastInteger;
public Long lastLong;
@Subscribe
public void listenInteger(Integer event) {
lastInteger = event;
}
@Subscribe
public void listenLong(Long event) {
lastLong = event;
}
public Integer getLastInteger() {
return lastInteger;
}
public Long getLastLong() {
return lastLong;
}
}
下面是对应的测试:
@Test
public void shouldReceiveMultipleEvents() throws Exception {
// given
EventBus eventBus = new EventBus("test");
MultipleListener multiListener = new MultipleListener();
eventBus.register(multiListener);
// when
eventBus.post(new Integer(100));
eventBus.post(new Long(800));
// then
assertThat(multiListener.getLastInteger()).isEqualTo(100);
assertThat(multiListener.getLastLong()).isEqualTo(800L);
}
高级用法
1.Dead Event
如果EventBus发送的消息都不是订阅者关心的称之为Dead Event. 看下面的例子:
/**
* Listener waiting for the event that any message was posted but not delivered to anyone
*/
public class DeadEventListener {
boolean notDelivered = false;
@Subscribe
public void listen(DeadEvent event) {
notDelivered = true;
}
public boolean isNotDelivered() {
return notDelivered;
}
}
下面是测试类:
@Test
public void shouldDetectEventWithoutListeners() throws Exception {
// given
EventBus eventBus = new EventBus("test");
DeadEventListener deadEventListener = new DeadEventListener();
eventBus.register(deadEventListener);
// when
eventBus.post(new OurTestEvent(200));
assertThat(deadEventListener.isNotDelivered()).isTrue();
}
如果没有消息订阅者监听消息, EventBus将发送DeadEvent消息, 这时我们可以通过log的方式来记录这种状态.
2.Event的继承
如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息
看下面的例子:
public class NumberListener {
private Number lastMessage;
@Subscribe
public void listen(Number integer) {
lastMessage = integer;
}
public Number getLastMessage() {
return lastMessage;
}
}
public class IntegerListener {
private Integer lastMessage;
@Subscribe
public void listen(Integer integer) {
lastMessage = integer;
}
public Integer getLastMessage() {
return lastMessage;
}
}
对应的测试类:
@Test
public void shouldGetEventsFromSubclass() throws Exception {
// given
EventBus eventBus = new EventBus("test");
IntegerListener integerListener = new IntegerListener();
NumberListener numberListener = new NumberListener();
eventBus.register(integerListener);
eventBus.register(numberListener);
// when
eventBus.post(new Integer(100));
// then
assertThat(integerListener.getLastMessage()).isEqualTo(100);
assertThat(numberListener.getLastMessage()).isEqualTo(100);
//when
eventBus.post(new Long(200L));
// then
// this one should has the old value as it listens only for Integers
assertThat(integerListener.getLastMessage()).isEqualTo(100);
assertThat(numberListener.getLastMessage()).isEqualTo(200L);
}
参考原文:
http://tomaszdziurko.pl/2012/01/google-guava-eventbus-easy-elegant-publisher-subscriber-cases/
分享到:
相关推荐
通过EventBus可以简化生产者/消费者 这种模型,同时又可以通过Executor来控制线程,使用起来非常优雅灵活。异步的则使用AsyncEventBus,如果需要强制使EventBus同步执行则可以使用@AllowConcurrentE
guava-api16/17/18chm
jar包,亲测可用
├─Google Guava 第18讲-Guava之EventBus的使用详解-2.wmv ├─Google Guava 第19讲-Guava之EventBus和NIO2.0 WatchService综合实战.wmv ├─Google Guava 第20讲-实战:手动实现一个EventBus-01快速搭建程序结构...
Guava 工程包含了若干被 Google 的 Java 项目广泛依赖 的核心库,希望通过此文档为 Guava 中最流行和最强大的功能,提供更具可读性和解释性的说明
guava 21.0版本各种jar包 zip包 源码包
使用google guava 实现定时缓存功能
eventBus android 跨页面异步传输数据 可用于异步网络请求和 异步跨页面传数据
汪文君Google Guava 代码。Guava之函数式接口、Guava EventBus源码剖析以及优缺点总结
EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。 ...
SpringBoot+EventBus使用教程示例代码,详细教程见博客地址:http://791202.com/2019/11/11/guava/74/
jar包,亲测可用
(摘自开源中国)Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。 目前主要包含: ...下载地址:https://repo1.maven.org/maven2/com/google/guava/guava/
Google Guava 官方教程 - 详情:https://blog.csdn.net/Dream_Weave/article/details/86252213
SNAPSHOTMaven依赖<dependency><groupId>com.woter.fact</groupId><artifactId>fact-bus</artifactId><version>1.0.0-SNAPSHOT</version></dependency>功能描述fact-bus 是基于guava整合spring实现EventBus;...
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...
Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法...
Getting Started with Google Guava, guava的技术参考文档
主要介绍了EventBus与Spring Event区别,需要的朋友可以参考下
Google Guava 官方教程 v1.1 2018-07-22 https://github.com/tianbian224/GuavaLearning/blob/master/Google%20Guava%20%E5%AE%98%E6%96%B9%E6%95%99%E7%A8%8B%20-%20v1.1.pdf