EventBus 是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。
实战编码
下面将以EventBus为例,AsyncEventBus使用方式与其一致的。
定义观察者
public class Observers {
public static class TextObserver {
@Subscribe
public void register(String text) {
System.out.println(MessageFormat.format("文本接收器接收到的内容=[{0}]", text));
}
}
public static class NumberObserver {
@Subscribe
public void register(Number number) {
System.out.println(MessageFormat.format("数字接收器接收到的内容=[{0}]", number));
}
@Subscribe
public void register(Integer number) {
System.out.println(MessageFormat.format("整型数字接收器接收到的内容=[{0}]", number));
}
@Subscribe
public void register(Long number) {
System.out.println(MessageFormat.format("长整型数字接收器接收到的内容=[{0}]", number));
}
}
}
程序验证
public class AnswerApp {
private static EventBus eventBus = new EventBus("事件总线");
private static Observers.TextObserver textObserver = new Observers.TextObserver();
private static Observers.NumberObserver numberObserver = new Observers.NumberObserver();
// 注册观察者接收器
static {
eventBus.register(textObserver);
eventBus.register(numberObserver);
}
public static void main(String[] args) throws Exception {
System.out.println(eventBus.identifier());
System.out.println();
eventBus.post("AnswerAIL");
eventBus.post(100);
eventBus.post(150L);
System.out.println();
System.out.println("休眠3秒...");
Thread.sleep(3000);
// 注销 数字接收器
eventBus.unregister(numberObserver);
System.out.println();
eventBus.post("AnswerAIL");
eventBus.post(100);
eventBus.post(150L);
}
}
运行结果输出
事件总线
文本接收器接收到的内容=[AnswerAIL]
整型数字接收器接收到的内容=[100]
数字接收器接收到的内容=[100]
长整型数字接收器接收到的内容=[150]
数字接收器接收到的内容=[150]
休眠3秒...
文本接收器接收到的内容=[AnswerAIL]
EventBus的使用注意问题
- 代码可读性很差,项目中使用的时候,从post的地方,查询handle使用,都是使用ide的搜索服务,问题很难定位,不如普通的接口调用方便查询
- 由于EventBus是将消息队列放入到内存中的,listener消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失
参考网址