Google Guava 事件总线工具使用详解

文章目录


事件总线

Guava 事件总线(EventBus)是 Google Guava 库中的一个组件,用于实现发布-订阅模式的事件通信。它提供了一种简单而强大的方式,让不同的组件之间能够解耦、相互通信、完成事件处理。

特点

  • 注册和订阅

    通过注册订阅者到事件总线中,订阅者可以接收和处理特定的事件。订阅者需要定义一个或多个事件处理方法,并使用 @Subscribe 注解进行标识。

  • 发布事件

    通过事件总线的 post 方法发送事件。事件可以是任意类型的对象,订阅者可以根据自己感兴趣的事件类型进行订阅。

  • 异步事件处理

    Guava 事件总线支持异步处理事件,通过使用 AsyncEventBus,可以在发送事件时指定自定义的线程池来处理事件。这样可以避免事件处理影响主线程的性能。

  • 过滤器

    可以使用 @Subscribe 注解的 @AllowConcurrentEvents 和 @AllowUserConcurrentEvents 参数来控制事件处理的并发性质。

  • 父子事件总线

    可以创建父子事件总线的层次结构,子事件总线可以继承父事件总线的事件订阅关系。

  • 异常处理

    可以通过定义应用程序级别的异常处理器 EventBusExceptionHandler 来处理事件处理过程中的异常。

  • 生命周期

    事件总线支持订阅者的生命周期管理,可以在订阅者的生命周期变化时,自动注册和注销订阅者。

使用

  1. 创建事件类:

    java 复制代码
    public class MyEvent {
        private final String message;
    
        public MyEvent(String message) {
            this.message = message;
        }
    
        public String getMessage() {
            return message;
        }
    }
  2. 创建订阅者类:

    java 复制代码
    public class MySubscriber {
        @Subscribe
        public void handleEvent(MyEvent event) {
            System.out.println("Received event: " + event.getMessage());
        }
    }
  3. 注册订阅者并发送事件:

    java 复制代码
    public class Main {
        public static void main(String[] args) {
            EventBus eventBus = new EventBus();
    		
    		// 注册订阅者
            MySubscriber subscriber = new MySubscriber();
            eventBus.register(subscriber);
    		
    		// 发送事件
            for (int i = 0; i < 10; i++) {
            	eventBus.post(new MyEvent("Hello, World!"));
        	}
        }
    }
  4. 使用自定义线程池处理事件:

    java 复制代码
    public class Main {
        public static void main(String[] args) {
            EventBus eventBus = new AsyncEventBus(Executors.newFixedThreadPool(3));
    		
    		// 注册订阅者
            MySubscriber subscriber = new MySubscriber();
            eventBus.register(subscriber);
    
    		// 发送事件
            for (int i = 0; i < 10; i++) {
            	eventBus.post(new MyEvent("Hello, World!"));
        	}
        }
    }

需要注意的是:Guava 事件总线是单进程的,且只适用于同一个 JVM 内部的组件通信。如果需要跨进程或分布式系统间的事件通信,可以考虑使用其他技术,例如消息队列、消息中间件等。

相关推荐
山河亦问安6 小时前
令牌桶算法的限流组件实现
guava
聊天QQ:276998856 天前
多智能体分布式模型预测控制在编队中的奇幻之旅
guava
武子康7 天前
Java-193 Spymemcached 深入解析:线程模型、Sharding 与序列化实践全拆解
java·开发语言·redis·缓存·系统架构·memcached·guava
武子康8 天前
Java-192 深入拆解 EVCache 内部原理:Memcached 架构、Slab 分配与 LRU 过期机制全解析
数据库·redis·缓存·架构·memcached·guava·evcache
武子康9 天前
Java-190 EVCache入门:Netflix 级分布式缓存架构、性能指标与多区域部署全解析
java·redis·分布式·缓存·架构·guava·guava cache
武子康9 天前
Java-189 Guava Cache 源码剖析:LocalCache、Segment 与 LoadingCache 工作原理全解析
java·redis·后端·spring·缓存·guava·guava cache
Dolphin_Home9 天前
【实用工具类】基于 Guava Cache 实现通用 Token 缓存工具类(附完整源码)
spring·缓存·guava
武子康10 天前
Java-187 Guava Cache 并发参数与 refreshAfterWrite 实战:LoadingCache 动态加载与自定义 LRU 全解析
java·开发语言·spring boot·redis·spring·缓存·guava
武子康10 天前
Java-188 Guava Cache 疑难问题实战:OOM、过期清理、命中率异常和阻塞排查
java·spring boot·redis·后端·spring·缓存·guava