博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava-EventBus使用详解
阅读量:5832 次
发布时间:2019-06-18

本文共 3075 字,大约阅读时间需要 10 分钟。

在中提到了用Spring提供的观察者设计模式完成系统内部逻辑解耦。本文将介绍Google-Guava中的一种消息发布-订阅类库——EventBus

EventBus 是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息

前提:在pom.xml中引入guava包

com.google.guava
guava
19.0

demo

(1)EventBusCenter.java

package com.lance.google.event.bus;    import com.google.common.eventbus.EventBus;    /**  * Created by zhangzh on 2017/1/10.  */  public class EventBusCenter {        private static EventBus eventBus = new EventBus();        private EventBusCenter() {        }        public static EventBus getInstance() {          return eventBus;      }        public static void register(Object obj) {          eventBus.register(obj);      }        public static void unregister(Object obj) {          eventBus.unregister(obj);      }        public static void post(Object obj) {          eventBus.post(obj);      }   }

(2) 观察者1

package com.lance.google.event.bus;    import com.google.common.eventbus.Subscribe;    /**  * Created by zhangzh on 2017/1/10.  */  public class DataObserver1 {        /**      * 只有通过@Subscribe注解的方法才会被注册进EventBus      * 而且方法有且只能有1个参数      *      * @param msg      */      @Subscribe      public void func(String msg) {          System.out.println("String msg: " + msg);      }    }

(3) 观察者2

package com.lance.google.event.bus;    import com.google.common.eventbus.Subscribe;    /**  * Created by zhangzh on 2017/1/10.  */  public class DataObserver2 {      /**      * post() 不支持自动装箱功能,只能使用Integer,不能使用int,否则handlersByType的Class会是int而不是Intege      * 而传入的int msg参数在post(int msg)的时候会被包装成Integer,导致无法匹配到      */      @Subscribe      public void func(Integer msg) {          System.out.println("Integer msg: " + msg);      }  }

(4) Test.java

package com.lance.google.event.bus;    /**  * Created by zhangzh on 2017/1/10.  */  public class Test {        public static void main(String[] args) throws InterruptedException {            DataObserver1 observer1 = new DataObserver1();          DataObserver2 observer2 = new DataObserver2();            EventBusCenter.register(observer1);          EventBusCenter.register(observer2);            System.out.println("============   start  ====================");            // 只有注册的参数类型为String的方法会被调用          EventBusCenter.post("post string method");          EventBusCenter.post(123);            System.out.println("============ after unregister ============");          // 注销observer2          EventBusCenter.unregister(observer2);          EventBusCenter.post("post string method");          EventBusCenter.post(123);            System.out.println("============    end           =============");      }  }

输出结果:

String msg: post string method  Integer msg: 123  ============ after unregister ============  String msg: post string method  ============    end           =============
  • EventBus的使用注意问题:
  1. 代码可读性很差,项目中使用的时候,从post的地方,查询handle使用,都是使用ide的搜索服务,问题很难定位,不如普通的接口调用方便查询;
  2. 由于EventBus是将消息队列放入到内存中的,listener消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失。

转载地址:http://zardx.baihongyu.com/

你可能感兴趣的文章
802.11 学习笔记
查看>>
Leetcode-Database-176-Second Highest Salary-Easy(转)
查看>>
构建Docker Compose服务堆栈
查看>>
最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
查看>>
Hadoop生态圈-Kafka常用命令总结
查看>>
如何基于Redis Replication设计并实现Redis-replicator?
查看>>
浮点数内存如何存储的
查看>>
贪吃蛇
查看>>
EventSystem
查看>>
用WINSOCK API实现同步非阻塞方式的网络通讯
查看>>
玩一玩博客,嘿嘿
查看>>
P1352 没有上司的舞会
查看>>
ios11文件夹
查看>>
【HLOJ 559】好朋友的题
查看>>
Electric Fence(皮克定理)
查看>>
nvl 在mysql中如何处理
查看>>
MyEclipse 快捷键
查看>>
快速傅里叶变换FFT
查看>>
大数据常用基本算法
查看>>
JavaScript学习笔记(十三)——生成器(generator)
查看>>