1.说明
EventBus是Google Guava的事件处理机制,
是设计模式中观察者模式的优雅实现,
是一个进程内的生产者/消费者模型。
为了解耦事件的发布和订阅,
使用EventBus组件,
是一个非常优雅和简单解决方案,
同时可以异步处理事件任务。
2.基本用法
- 创建事件消息类,普通的POJO类即可,无需额外的注解或者继承。
- 创建事件监听类,在事件处理方法上使用@Subscribe即可。
- 创建EventBus实例,并且注册事件监听类。
- 创建事件消息类的实例,使用EventBus实例发布事件。
下面演示从设备采集CPU和内存信息,
把采集到的信息直接当成事件,
发布给对应的监听类处理。
3.创建事件消息类
CPU和内存类,非常简单,
只需要和业务相关即可,
框架对消息类不做要求。
public class CpuInfos {...}
public class MemoryInfos {...}
4.创建事件监听类
处理监听类DevmEventListener
能够处理采集到的设备信息,
为了演示简单,这里只是打印日志,
注意使用@Subscribe注解:
import com.google.common.eventbus.Subscribe;
public class DevmEventListener {
private static Logger logger = LoggerFactory.getLogger(DevmEventListener.class);
@Subscribe
public void handleDevmCpuInfos(CpuInfos cpuInfos) {
logger.info("CPU信息处理={}", cpuInfos);
}
@Subscribe
public void handleDevmMemoryInfos(MemoryInfos memoryInfos) {
logger.info("内存信息处理={}", memoryInfos);
}
}
5.创建EventBus实例,注册事件监听类
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.AsyncEventBus;
// 异步非阻塞模式
EventBus eventBus = new AsyncEventBus(Executors.newFixedThreadPool(DEFAULT_EVENTBUS_THREAD_POOL_SIZE));
// 注册观察者,即事件处理类
eventBus.register(new DevmEventListener());
上面的AsyncEventBus是异步非阻塞模式,
也可以创建EventBus使用同步阻塞模式。
EventBus eventBus = new EventBus("Synchronous");
一个EventBus实例中可用注册多个观察者,
观察者中如果订阅了相同的事件,
会按照注册顺序调用对应的处理方法。
应用中可用创建多个EventBus实例,
隔离不同的事件处理场景。
6.发布事件
创建事件消息类的实例,
使用EventBus实例发布事件:
CpuInfos cpuInfos = new CpuInfos();
eventBus.post(cpuInfos);
7.运行测试
运行代码,输出如下日志:
2021-09-03 15:22:31.189 [pool-3-thread-2] INFO [DevmEventListener.handleDevmCpuInfos(24)] - CPU信息处理=cpuInfo {
entIndex: 16973825
interval: 8
ovloadThreshold: 90
position: "3"
systemCpuUsage: 16
unovloadThreshold: 75
}
网友评论