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 内部的组件通信。如果需要跨进程或分布式系统间的事件通信,可以考虑使用其他技术,例如消息队列、消息中间件等。

相关推荐
非往2 天前
五、Java并发 Java Google Guava 实现
java·开发语言·guava
gorgor在码农2 天前
Google Guava 发布订阅模式/生产消费者模式 使用详情
guava
鱼跃鹰飞5 天前
大厂面试真题-如果使用guava limiter实现实例级别的缓存
缓存·面试·guava
鱼跃鹰飞7 天前
大厂面试真题-caffine比guava有什么提升?
数据库·mysql·面试·职场和发展·guava
ldxxxxll23 天前
Guava使用指南2
java·算法·guava
电脑令人发狂的1 个月前
Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存
spring boot·jar·guava
杏花春雨江南1 个月前
guava里常用功能
服务器·windows·guava
杀死一只知更鸟debug2 个月前
Guava中Preconditions校验
guava
我是鸹貔2 个月前
guava-Immutable(不可变集合)
java·guava
sco52822 个月前
SpringBoot 整合 Guava Cache 实现本地缓存
缓存·oracle·guava