Guava - EventBus(事件总线)

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消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失

参考网址

发布了152 篇原创文章 · 获赞 27 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u010979642/article/details/103454442