首页 > 其他分享 >Google Guava 工具类(一)—— EventBus(观察者模式的实现)

Google Guava 工具类(一)—— EventBus(观察者模式的实现)

时间:2022-11-01 09:56:15浏览次数:55  
标签:Google message 监听 AsyncEventBus 消息 EventBus Guava public

Google Guava 工具类(一)—— EventBus(观察者模式的实现)

❗❗❗ 未解决的问题:

  1. AsyncEventBus 的并发执行

  EventBus 是设计模式中的观察者模式(生产者/消费者编程模型)的实现。

  在学习 EventBus 之前,先了解一下其涉及到的相关术语

EvenBus 中的相关术语

EventBus 术语 解释 备注
事件(消息) 可以向事件总线(EventBus)发布的对象 通常是一个类,不同的消息事件用不同的类来代替,消息内容就是类里面的属性
订阅 向事件总线注册监听者,以接受事件的行为 EventBus.register(Object),参数就是监听者
监听者 提供一个处理方法,希望接受和处理事件的对象 通常也是一个类,里面有消息的处理方法
处理方法 监听者提供的公共方法,事件总线使用该方法向监听者发送事件;该方法应使用 Subscribe 注解 监听者里面添加一个 Subscribe 注解的方法,就可以认为是消息的处理方法
发布消息 通过事件总线向所有匹配的监听者提供事件 EventBus.post(Object)

EvenBus 的简单使用

  添加依赖

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>

  EventBus 的使用很简单,笼统来说可分为以下几个步骤。

  1. 创建 EventBus 对象。通常全局或模块内通过单例模式只用一个 EventBus 对象
  2. 创建消息类
  3. 创建监听者类
  4. 注册监听者类。如果有多个 EventBus 对象,监听者类注册在哪个 EventBus 对象下,消息就需要发布到对应的 EventBus 中
  5. 发布消息

  EventBusDemo.java

package cn.jkingtools.demo.guava.eventbus;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

public class EventBusDemo {
    // 1. 创建消息类
    private static class Message {
        private String message;

        public Message(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }
    }

    // 2. 创建监听者类,即事件处理函数,需要使用 @Subscribe 进行注解
    private static class EventListener {
        @Subscribe
        public void dealWithEvent(Message msg) {
            System.out.println("接收消息" + msg.getMessage());
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("处理消息" + msg.getMessage());
        }
    }

    public static void main(String[] args) {
        // 3. 创建 EventBus 对象
        EventBus eventBus = new EventBus("Test");
        // 4. 注册监听者类
        eventBus.register(new EventListener());
        // 5. 发布消息
        for (int i=0; i<5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("---------");
            eventBus.post(new Message("tttt" + i));
        }
    }
}

  执行输出信息:

---------
接收消息tttt0
处理消息tttt0
---------
接收消息tttt1
处理消息tttt1
---------
接收消息tttt2
处理消息tttt2
---------
接收消息tttt3
处理消息tttt3
---------
接收消息tttt4
处理消息tttt4

  在上面的代码中,添加了几个 sleep,在实际运行的时候注意输出,所有的事件消息都是顺序输出的。这是因为事件的发送方和事件消费方都在一个线程中,事件发送方只有在发送的事件处理完毕后才会继续执行自己后面的代码。这里可使用 AsyncEventBus 类实现事件的异步处理,也就是将事件处理放到一个线程池里面去执行。

AsyncEventBus(EventBus 的异步实现)

  com.google.common.eventbus.AsyncEventBus 是 EventBus 的异步实现,即将事件放到一个单独的线程池中去执行,只需要将实例化的 EventBus 对象换成 AsyncEventBus 即可,并传入一个线程池对象。

AsyncEventBus asyncEventBus = new AsyncEventBus("", Executors.newCachedThreadPool());

❗❗❗ 我的测试源码如下,但未实现事件的并行执行。

package cn.jkingtools.demo.guava.eventbus;

import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

import java.util.concurrent.Executors;

public class AsyncEventBusDemo {
    // 1. 创建消息类
    private static class Message {
        private String message;

        public Message(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }
    }

    // 2. 创建监听者类,即事件处理函数,需要使用 @Subscribe 进行注解
    private static class EventListener {
        @Subscribe
        public void dealWithEvent(Message msg) {
            System.out.println("接收消息" + msg.getMessage());
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("处理消息" + msg.getMessage());
        }
    }

    public static void main(String[] args) {
        // 3. 创建 EventBus 对象
        AsyncEventBus eventBus = new AsyncEventBus("Test", Executors.newCachedThreadPool());
        // 4. 注册监听者类
        eventBus.register(new EventListener());
        // 5. 发布消息
        for (int i=0; i<10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("---------");
            eventBus.post(new Message("tttt" + i));
        }
    }
}

输出信息如下:

---------
接收消息tttt0
---------
---------
---------
---------
处理消息tttt0
接收消息tttt4
处理消息tttt4
接收消息tttt3
处理消息tttt3
接收消息tttt2
处理消息tttt2
接收消息tttt1
处理消息tttt1

通过观察输出,AsyncEventBus 虽然并未在主线程阻塞,但事件却是被顺序执行的,并未实现并发。

标签:Google,message,监听,AsyncEventBus,消息,EventBus,Guava,public
From: https://www.cnblogs.com/jieg01/p/16846708.html

相关文章

  • 设置Google浏览器不更新
    设置Google浏览器不更新右键计算机=>管理,在计算机管理(本地)=>系统工具=>任务计划程序=>任务计划程序库中找到两个和Google自动更新相关的任务计划:GoogleUpdateTaskMa......
  • Google Earth Engine(GEE)分析多个地区的植被覆盖趋势
    数据介绍:使用的是MODIS数据的NDVI和EVI来分析多个地区的植被覆盖趋势在GEE调用的数据名称为“MODIS/061/MOD13A1”本次利用MODIS数据中的两个数据分别是“NDVI”和"EVI"**ND......
  • Google 登录,海外游戏接入
    ##准备1,开发者注册(需要25美元,国内任意一家visa信用卡都可以绑定支付,推荐招商银行的),商家账号注册(需要填写资料)2,创建项目-打开网址https://console.cloud.google.com/,......
  • 【Vue2.0学习】—全局事件总线GlobalEventBus(六十一)
    【Vue2.0学习】—全局事件总线GlobalEventBus(六十一)知识回顾:全局事件总线(GlobalEventBus)一种组件间通信的方式,适用于任意组件间通信安装全局事件总线:使用事件总线:接收数据......
  • Google-高精地图-riscv-收购Twitter杂谈
    Google-高精地图-riscv-收购Twitter杂谈参考文献链接https://mp.weixin.qq.com/s/xk4RvcYVXOJ-1WfSCcvnPQhttps://mp.weixin.qq.com/s/24LD5uKTkAG_lIYHWmpX_ghttps://......
  • java-guava 布隆筛选器用法及比较
    java-guava布隆筛选器用法及比较布隆筛选器使用场景:   一般用于一个字符串是否存的预测,如爬虫是否抓取过这个URL等。优点:   对于特大的集合来说,检索快、占用内......
  • google api 后端打点上报
    https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type=gtag使用GA4做打点上报会更更合适点其中measurement_id ......
  • How to detect if you are in Incognito mode in Google Chrome with JavaScript
    varfs=window.RequestFileSystem||window.webkitRequestFileSystem;if(!fs){console.log("checkfailed?");}else{fs(window.TEMPO......
  • ping dl.google的服务配置
    在开发android应用时候,需要解决与google配置的问题:除了打开防火墙的配置。接着就是DNS的配置:DNS的配置如下:DNS配置如下:这里并不影响IP的获取:效果如下: ......
  • 只需三步 带你了解 Vue事件总线(EventBus)
    第一步:直接在项目中的 main.js 初始化 EventBus ://main.jsVue.prototype.$EventBus=newVue()第二步:找到两个页面A和B,A向B发送事件<!--A.vue--><templat......