Guava Eventbus-1

73 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

一、背景

在开发语音转录项目,创建项目后存在大量音频需要调用PaaS语音转录接口接收回调数据,考虑实际业务场景:音频文件多、请求量大、顺序写,基本都是IO耗时操作,直接处理回调数据可能会存在问题。

能想到的方案:

1、kafka接收,再消费

2、增加queue接收,再消费

3、使用Guava的EventBus事件机制实现

对比选择Guava的EventBus去实现接收回调数据,简单、稳定、节约时间

EventBus说明

EventBus是Guava封装的事件处理机制,属于设计模式中的观察者模式(生产|消费者编程模型)。使用简单、优雅只关注业务本身,仅限JVM内部使用,缺点:不适用分布式,看实际业务可选用MQ

img

 事件总线(EventBus)处理个服务、或业务间公共线路,而EventBus则是存储事件、处理时间中间服务,通过post()往EventBus发送事件,由EventBus去调度对应订阅方(subscriber)消费处理,解耦观察者模式中订阅方与事件源之间强依赖关系。

二、如何使用

1、引入Maven依赖

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>

2、支付场景举例(伪代码)

定义EventBus类

public class EventBusCenter {
    private static EventBus eventBus = new EventBus();
    private EventBusCenter() {
    }
    public static EventBus getInstance(){
        return eventBus;
    }
    /**注册监听*/
    public static void register(Object listener){
        eventBus.register(listener);
    }
    /**取消注册*/
    public static void unregister(Object listener){
        eventBus.unregister(listener);
    }
    /**发布事件*/
    public static void post(Object event){
        eventBus.post(event);
    }
}

定义业务对象

public class OrderInfo {
    private long orderId;
    private String orderName;
 }
 
 public class OrderFailInfo{
    private long orderId;
    private String orderName;
    private String msg;
}

支付成功监听处理事件

public class OrderSuccessListener {
    @Subscribe
    public void orderSubscribe(OrderInfo event) {
        // 订单业务监听
        System.out.println("订单支付成功处理事件: " + event);
    }
    @Subscribe
    public void ortherSubscribe(OrderInfo event) {
        // 其它业务监听
        System.out.println("订单支付成功其它处理事件: " + event);
    }
}

支付失败监听处理事件

public class OrderFailListener {
    @Subscribe
    public void orderSubscribe(OrderFailInfo event) {
        // 订单业务监听
        System.err.println("订单支付失败处理事件: " + event);
    }
    @Subscribe
    public void ortherSubscribe(String event) {
        // 其它业务监听
        System.err.println("订单支付失败其它处理事件: " + event);
    }
}

测试用例

public class EventBusTest {
    public static void main(String[] args) {
        OrderSuccessListener successListener = new OrderSuccessListener();
        OrderFailListener failListener = new OrderFailListener();
            EventBusCenter.register(successListener);
            EventBusCenter.register(failListener);
            OrderInfo order = OrderInfo.builder().orderId(111L).orderName("订单名称xxx").build();
            log.info("=====支付成功=======");
            EventBusCenter.post(order);

            log.info("=====支付失败=======");
            OrderFailInfo orderFail = OrderFailInfo.builder().orderId(111L).orderName("订单名称xxx").msg("支付失败").build();
            EventBusCenter.post(orderFail);
            log.info("=====记录支付失败原因=======");
            EventBusCenter.post("用户取消订单");
    }
}

输出结果:
信息: =====支付成功=======
订单支付成功其它处理事件: OrderInfo(orderId=111, orderName=订单名称xxx)
订单支付成功处理事件: OrderInfo(orderId=111, orderName=订单名称xxx)

信息: =====支付失败=======
订单支付失败处理事件: OrderFailInfo(orderId=111, orderName=订单名称xxx, msg=支付失败)

信息: =====记录支付失败原因=======
订单支付失败其它处理事件: 用户取消订单

使用说明:

  • 只有通过***@Subscribe***注解才会被注册进EventBus
  • 监听方法只能有1个参数,当有多个监听方法时,参数类型一样并行消费;不同参类型对应不对消费事件