Google Guava和EventBus
1. Google Guava简介
Guava是Google开发的Java工具库,提供了很多实用工具:
- 集合工具(Collections)
- 缓存工具(Cache)
- 并发工具(Concurrency)
- 字符串处理(Strings)
- I/O工具(I/O)
- EventBus(事件总线)
2. EventBus使用示例
- 基础使用
// 1. 创建EventBus
@Configuration
public class EventBusConfig {
@Bean
public EventBus eventBus() {
return new EventBus("messageEventBus");
}
}
// 2. 定义事件
@Data
@AllArgsConstructor
public class MessageEvent {
private String userId;
private Message message;
}
// 3. 创建订阅者
@Component
@RequiredArgsConstructor
public class MessageEventListener {
private final WebSocketHandler webSocketHandler;
@Subscribe // 标记订阅方法
public void handleMessageEvent(MessageEvent event) {
webSocketHandler.sendMessage(event.getUserId(), event.getMessage());
}
}
// 4. 发布事件
@Service
public class MessageService {
private final EventBus eventBus;
public void sendMessage(String userId, Message message) {
// 发布事件
eventBus.post(new MessageEvent(userId, message));
}
}
- 异步EventBus
// 创建异步EventBus
@Bean
public AsyncEventBus asyncEventBus() {
return new AsyncEventBus("asyncMessageEventBus",
Executors.newFixedThreadPool(10));
}
// 异步订阅者
@Subscribe
@AllowConcurrentEvents // 允许并发执行
public void handleAsyncEvent(MessageEvent event) {
// 异步处理
}
3. EventBus高级特性
- Dead Event处理
@Subscribe
public void handleDeadEvent(DeadEvent deadEvent) {
log.warn("未被处理的事件: {}", deadEvent.getEvent());
}
- 事件继承
// 基础事件
public class BaseEvent { }
// 特定事件
public class SpecificEvent extends BaseEvent { }
// 订阅者可以处理父类事件
@Subscribe
public void handleBaseEvent(BaseEvent event) {
// 处理所有继承自BaseEvent的事件
}
- 错误处理
public class LoggingEventBus extends EventBus {
@Override
public void handleSubscriberException(Throwable e,
SubscriberExceptionContext context) {
log.error("事件处理异常", e);
}
}
4. EventBus原理解析
- 核心组件
public class EventBus {
// 事件分发器
private final Dispatcher dispatcher;
// 订阅者注册表
private final SubscriberRegistry subscribers;
// 事件发布
public void post(Object event) {
// 1. 获取事件分发链
Iterator<Subscriber> eventSubscribers =
subscribers.getSubscribers(event);
// 2. 分发事件
dispatcher.dispatch(event, eventSubscribers);
}
}
- 订阅注册过程
// 注册订阅者
public void register(Object object) {
// 1. 查找带有@Subscribe注解的方法
List<SubscriberMethod> methods =
findSubscriberMethods(object);
// 2. 注册到订阅者注册表
for (SubscriberMethod method : methods) {
subscribe(object, method);
}
}
5. 最佳实践
- 事件分类管理
// 按模块定义事件
public class UserEvents {
@Data @AllArgsConstructor
public static class UserCreated { }
@Data @AllArgsConstructor
public static class UserUpdated { }
}
- 异常处理
@Subscribe
public void handleEvent(MessageEvent event) {
try {
// 处理事件
} catch (Exception e) {
log.error("事件处理失败", e);
// 可以选择重新发布事件或其他处理
}
}
- 性能优化
@Configuration
public class EventBusConfig {
@Bean
public AsyncEventBus asyncEventBus() {
// 使用自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, 10, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000),
new ThreadFactoryBuilder()
.setNameFormat("event-bus-pool-%d")
.build()
);
return new AsyncEventBus(executor);
}
}
- 事件追踪
@Aspect
@Component
public class EventBusAspect {
@Around("execution(* com.example..*.@Subscribe *(..))")
public Object trackEvent(ProceedingJoinPoint pjp) {
// 记录事件处理开始
long start = System.currentTimeMillis();
Object result = pjp.proceed();
// 记录事件处理完成
log.info("事件处理耗时: {}ms",
System.currentTimeMillis() - start);
return result;
}
}
EventBus是一个强大的事件处理框架,适合用于:
- 系统解耦
- 异步处理
- 消息通知
- 插件架构
使用时要注意:
- 合理规划事件类型
- 处理异常情况
- 考虑性能影响
- 做好监控追踪