文章目录
事件总线
Guava 事件总线(EventBus)是 Google Guava 库中的一个组件,用于实现发布-订阅模式的事件通信。它提供了一种简单而强大的方式,让不同的组件之间能够解耦、相互通信、完成事件处理。
特点
-
注册和订阅
通过注册订阅者到事件总线中,订阅者可以接收和处理特定的事件。订阅者需要定义一个或多个事件处理方法,并使用 @Subscribe 注解进行标识。
-
发布事件
通过事件总线的 post 方法发送事件。事件可以是任意类型的对象,订阅者可以根据自己感兴趣的事件类型进行订阅。
-
异步事件处理
Guava 事件总线支持异步处理事件,通过使用 AsyncEventBus,可以在发送事件时指定自定义的线程池来处理事件。这样可以避免事件处理影响主线程的性能。
-
过滤器
可以使用 @Subscribe 注解的 @AllowConcurrentEvents 和 @AllowUserConcurrentEvents 参数来控制事件处理的并发性质。
-
父子事件总线
可以创建父子事件总线的层次结构,子事件总线可以继承父事件总线的事件订阅关系。
-
异常处理
可以通过定义应用程序级别的异常处理器 EventBusExceptionHandler 来处理事件处理过程中的异常。
-
生命周期
事件总线支持订阅者的生命周期管理,可以在订阅者的生命周期变化时,自动注册和注销订阅者。
使用
-
创建事件类:
javapublic class MyEvent { private final String message; public MyEvent(String message) { this.message = message; } public String getMessage() { return message; } }
-
创建订阅者类:
javapublic class MySubscriber { @Subscribe public void handleEvent(MyEvent event) { System.out.println("Received event: " + event.getMessage()); } }
-
注册订阅者并发送事件:
javapublic 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!")); } } }
-
使用自定义线程池处理事件:
javapublic 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 内部的组件通信。如果需要跨进程或分布式系统间的事件通信,可以考虑使用其他技术,例如消息队列、消息中间件等。