持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
一、背景
在开发语音转录项目,创建项目后存在大量音频需要调用PaaS语音转录接口接收回调数据,考虑实际业务场景:音频文件多、请求量大、顺序写,基本都是IO耗时操作,直接处理回调数据可能会存在问题。
能想到的方案:
1、kafka接收,再消费
2、增加queue接收,再消费
3、使用Guava的EventBus事件机制实现
对比选择Guava的EventBus去实现接收回调数据,简单、稳定、节约时间
EventBus说明
EventBus是Guava封装的事件处理机制,属于设计模式中的观察者模式(生产|消费者编程模型)。使用简单、优雅只关注业务本身,仅限JVM内部使用,缺点:不适用分布式,看实际业务可选用MQ
事件总线(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个参数,当有多个监听方法时,参数类型一样并行消费;不同参类型对应不对消费事件