2019独角兽企业重金招聘Python工程师标准>>>

一、适用场景

很多时候一个事件会触发很多其他的事件,比如说一个充值操作,可能会设计到一些其他的操作,比如充值完成会奖励一些抽奖机会,要增加VIP等级,要赠送金币,积分,可能还会涉及到物流,运营。

如果把这些逻辑都弄到充值这个流程中,那么不管你代码写的多么的牛逼都会显得比较混乱,而且只要有一个逻辑要改,就得改充值,显然不应该因为一个其他逻辑的规则变了就该一次充值这种核心的业务。

如果系统拆分的好,这些可能就会在活动系统,用户系统,运营系统,物流系统中。这样充值逻辑就不用管那么多了,直接发一个kafka消息,需要知道完成充值的自己去订阅,该干嘛干嘛。

EventBus是应对系统还没有拆分时候上面的场景的一个办法。

二、EventBus的3个关键点

事件

就是发生了什么事情,这个事件一般是很多其他业务关心的事件,比如上面的充值事件,这个事件会封装一些其他业务需要的参数,例如用户相关的信息,充值相关的信息。主要是方便其他的业务使用。

事件监听者(事件处理器)

就是接受到事件了处理事件的逻辑,一般是一个方法,比如活动系统接受到了充值完成的事件之后,检查是否有满足要求的活动通知用户参与的逻辑。

建议尽量将不同的处理分开,让业务更加的清晰,以便于扩展。不要因为刚刚开始的时候比较简单,就把业务绞到一起。

触发事件

这个虽然比较重要但是,比较简单,就是完成相应的业务之后,发消息。

三、实例

充值事件

我们先来看一下其他业务关心的逻辑,充值,所以我们封装一个充值事件。

import cn.freemethod.guava.bean.ChargeBean;
import cn.freemethod.guava.bean.UserBean;import java.io.Serializable;public class ChargeEvent implements Serializable{private static final long serialVersionUID = -8775590840527884827L;private UserBean user;private ChargeBean charge;public UserBean getUser() {return user;}public void setUser(UserBean user) {this.user = user;}public ChargeBean getCharge() {return charge;}public void setCharge(ChargeBean charge) {this.charge = charge;}
}

里面的属性user和charge是其他的业务可能使用到的参数信息。

UserBean

import java.io.Serializable;public class UserBean implements Serializable{private static final long serialVersionUID = 3864751233076912473L;private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

ChargeBean

import java.io.Serializable;public class ChargeBean implements Serializable {private static final long serialVersionUID = 3934449059968595133L;private Integer id;private Integer orderId;/*** 分*/private Integer money;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getOrderId() {return orderId;}public void setOrderId(Integer orderId) {this.orderId = orderId;}public Integer getMoney() {return money;}public void setMoney(Integer money) {this.money = money;}
}

充值事件处理

既然是其他的业务关系充值事件,那肯定是要处理充值事件的了。

import cn.freemethod.guava.event.ChargeEvent;
import com.google.common.eventbus.Subscribe;import java.util.concurrent.TimeUnit;public class CommonListener {@Subscribepublic void dealChargeGold(ChargeEvent event){try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("处理gold");}@Subscribepublic void dealChargeLevel(ChargeEvent event){System.out.println("处理level");}
}

这里为了方便,我就简单添加了一个Listener,里面有2个简单的处理充值事件的方法。 实际中尽量把他们分开。 为事件添加处理方法,如果是使用EventBus只需要在处理事件上的方法上添加上@Subscribe注解就可以了。

发送消息

import cn.freemethod.guava.event.ChargeEvent;
import cn.freemethod.guava.listener.CommonListener;
import com.google.common.eventbus.AsyncEventBus;import java.util.concurrent.Executors;public class EventBusStart {public static void main(String[] args) {
//        final EventBus eventBus = new EventBus();
//        eventBus.register(new CommonListener());
//        eventBus.post(new ChargeEvent());final AsyncEventBus asyncEventBus = new AsyncEventBus(Executors.newCachedThreadPool());asyncEventBus.register(new CommonListener());asyncEventBus.post(new ChargeEvent());System.out.println("main");}
}

首先事件处理器还是得注册一下是吧:

asyncEventBus.register(new CommonListener());

当充值完成的时候,触发一个ChargeEvent事件:

asyncEventBus.post(new ChargeEvent());

四、EventBus 与 AsynEventBus的区别

对于EventBus和AsynEventBus的区别可以把上面的AsynEventBus替换为EventBus试一下就知道了。

简单的来说就是,EventBus是同步的,这个同步是针对事件处理器来说,例如上面的充值事件的处理逻辑就会等CommonListener中的逻辑执行完成。通过@Subscribe注解的方式,我觉得这个逻辑基本是不关心处理结果的。所以大多数时候还是直接使用AsynEventBus就可以了。

想要知道执行结果就是使用EventBus吧,不过获取结果的确是比较尴尬的。要通过一些特殊的手段。

转载于:https://my.oschina.net/u/2474629/blog/1621277

Guava EventBus 和 AsynEventBus相关推荐

  1. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  2. Google Guava EventBus用于事件编程

    在任何软件应用程序中都是如此,有些对象需要共享信息才能完成工作. 在Java应用程序中,实现信息共享的一种方法是拥有事件侦听器,其唯一目的是在发生所需事件时采取某些措施. 在大多数情况下,此过程有效, ...

  3. Google Guava EventBus和Java 7 WatchService用于事件编程

    这篇文章将介绍如何使用Guava EventBus将更改发布到Java 7 WatchService检测到的目录或子目录中. Guava EventBus是向应用程序添加发布/订阅通信的好方法. Ja ...

  4. Guava EventBus 使用

    Guava EventBus 使用 EventBus 是 Google Guava 提供的消息发布-订阅类库,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现,消息通知负责人通过 Event ...

  5. java guava eventbus_JAVA | Guava EventBus 使用

    JAVA | Guava EventBus 使用 系列文章目录 Table of Contents [TOC] 前言 EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的 ...

  6. Guava事件处理组件Eventbus使用入门

    1.说明 EventBus是Google Guava的事件处理机制, 是设计模式中观察者模式的优雅实现, 是一个进程内的生产者/消费者模型. 为了解耦事件的发布和订阅, 使用EventBus组件, 是 ...

  7. EventBus VS Spring Event

    EventBus VS Spring Event 本地异步处理,采用事件机制 可以使 代码解耦,更易读.事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者.监听者.事件. Gua ...

  8. Guava关于JAVA中系统组件之间交互通讯(非线程之间通讯)

    2019独角兽企业重金招聘Python工程师标准>>> Guava EventBus组件 // Class is typically registered by the contai ...

  9. Guava、Spring 如何抽象观察者模式?

    什么是观察者模式 观察者模式 是一种行为设计模式,允许定义一种订阅通知机制,可以在对象(被观察者)事件发生时通知多个 "观察" 该对象的观察者对象,所以也被称为 发布订阅模式 其实 ...

最新文章

  1. 29岁双非计算机硕士毕业好就业吗,双非硕士与985本科生对比,两者“含金量”谁高?HR回答太现实...
  2. 曙光计算机系统,曙光1000大规模并行计算机系统
  3. VS2008中自定义C++工程模板与修改新建文件默认编码的办法
  4. Hadoop2.2.0+hive使用LZO压缩那些事
  5. 【是泰波那契,不是斐波那契】1137. 第 N 个泰波那契数
  6. net 快速打印日志
  7. java实现int类型数组元素拷贝
  8. vue插件:vue-resource的使用笔记
  9. 3.Android的新虚拟ART与原虚拟机DVM的区别
  10. 海神祭司被机器人拉出来_全联盟最不怕机器人钩子的四个英雄,最后一个巴不得被钩中...
  11. boost库的lock_ops类的变化
  12. Singularity将本地SIF文件,转成sandbox
  13. C#中不失真生成缩略图
  14. Property Bags Object Model中的小“陷阱”
  15. Java中面向接口编程的简单案例(电脑、鼠标、键盘、USB接口)
  16. n918st能刷Android5吗?,中兴 N918ST中文Recovery刷机教程
  17. 【新手入门】自己动手搭建云服务器
  18. 数组基础与字符串(尚学堂视频学习总结_004)
  19. 关于JavaScript继承与原型链的一些理解
  20. SpringBoot框架用法解析大全(没有你找不到的)

热门文章

  1. vs2013 配置 freeglut3.0(opengl的窗口系统库)
  2. strncpy 安全吗?
  3. android用符号表定位问题
  4. 2019年新的开始 加油
  5. OpenCV-Python learning-2.视频、相机简单处理
  6. UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
  7. 科恩兄弟《谋杀绿脚趾》
  8. 孩子用什么样的灯对眼睛没有伤害呢?分享对孩子眼睛好的台灯
  9. 母婴类微博怎么运营?还是在玩微博呢?还是被微博玩呢?
  10. 庄小威超分辨storm_庄小威15岁进中科大少年班,中国天才却成美国院士,如今又获大奖...