简介

继续上篇,本篇文章介绍如何集成spring-boot-starter-guava-eventbus使用EventBus,最新的版本好像已经不叫spring-boot-starter-guava-eventbus,而是guava-eventbus-spring-boot-starter。

使用

1.引入pom

        <dependency>
<groupId>org.zalando.stups</groupId>
<artifactId>spring-boot-starter-guava-eventbus</artifactId>
<version>0.5.4</version>
</dependency>

2.MessagePublisher

@Component
@Slf4j
public class MessagePublisher { private final EventBus eventBus; @Autowired
public MessagePublisher(final EventBus eventBus){
this.eventBus = eventBus;
} public void sendMessage(){
this.eventBus.post(MessageEvent.builder().id(1).name("test").build());
log.info("send message...");
} }

3.EventListener

import com.google.common.eventbus.Subscribe;
import com.sww.eventbus.domain.MessageEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; @Component
@Slf4j
public class EventListener { @Subscribe
public void onMessageEvent(MessageEvent event) {
log.info("Subscribe message:{}", event);
} }

这边和上篇不一样的是@Subscribe所在的包变了。

3.MessageEvent

和上篇一样。

4.测试类

import com.sww.eventbus.publish.MessagePublisher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class)
@SpringBootTest
public class EventbusApplicationTests { @Autowired
private MessagePublisher messagePublisher; @Test
public void contextLoads() {
messagePublisher.sendMessage();
} }

5.运行结果

2019-11-03 20:32:25.052  INFO 16172 --- [           main] com.sww.eventbus.listener.EventListener  : Subscribe message:MessageEvent(id=1, name=test)
2019-11-03 20:32:25.052 INFO 16172 --- [ main] c.sww.eventbus.publish.MessagePublisher : send message...

6.使用EventBusSupport

看到Support就应该知道是啥意思了,比方说JdbcDaoSupport是帮助我们快捷使用jdbc,EventBusSupport可以帮助我们快捷使用EventBus,看下它的源码,很明显还有一个异步的方法。

public interface EventBusSupport {

    void post(Object event);

    void postAsync(Object event);

}

再看下它的实现类,可以看到是在配置类EventBusAutoConfiguration里的静态内部类EventBusSupportImpl,可以看到EventBusSupportImpl的内容其实就和我们一开使写的东西是一样的,也就是它帮我们封装好了,我们直接用它就可以了。可以看到接口里的postAsync其实就是用的EventBus的AsyncEventBus。

@Configuration
public class EventBusAutoConfiguration { @Bean
public EventBusSupport eventBusWrapper() {
return new EventBusSupportImpl(eventBus(), asyncEventBus());
} @Bean
public EventBus eventBus() {
EventBus eventBus = new EventBus();
return eventBus;
} @Bean
public AsyncEventBus asyncEventBus() {
AsyncEventBus asyncEventBus = new AsyncEventBus("asyncDefault", Executors.newFixedThreadPool(2));
return asyncEventBus;
} @Bean
public EventBusSubscriberBeanPostProcessor subscriberAnnotationProcessor() {
return new EventBusSubscriberBeanPostProcessor(eventBus(), asyncEventBus());
} /**
* Simple implementation of {@link EventBusSupport}.
*
* @author jbellmann
*/
static final class EventBusSupportImpl implements EventBusSupport {
private EventBus eventBus;
private AsyncEventBus asyncEventBus; EventBusSupportImpl(final EventBus eventBus, final AsyncEventBus asyncEventBus) {
Assert.notNull(eventBus, "EventBus should not be null");
Assert.notNull(asyncEventBus, "AsyncEventBus should not be null");
this.eventBus = eventBus;
this.asyncEventBus = asyncEventBus;
} @Override
public void post(final Object event) {
this.eventBus.post(event);
} @Override
public void postAsync(final Object event) {
this.asyncEventBus.post(event);
}
}
}

7.EventBusHandler

@Component
@Slf4j
public class EventBusHandler { @Autowired
private final EventBusSupport eventBusSupport; public EventBusHandler(final EventBusSupport eventBusSupport){
this.eventBusSupport = eventBusSupport;
} public void eventPost(){
eventBusSupport.post(MessageEvent.builder().id(1).name("test").build());
log.info("post event");
eventBusSupport.postAsync(MessageEvent.builder().id(2).name("AsyncTest").build());
log.info("post async event");
}
}

8.运行测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class EventbusApplicationTests { @Autowired
private EventBusHandler eventBusHandler; @Test
public void contextLoads() {
eventBusHandler.eventPost();
}
}

结果

2019-11-03 20:50:02.028  INFO 12292 --- [           main] com.sww.eventbus.listener.EventListener  : Subscribe message:MessageEvent(id=1, name=test)
2019-11-03 20:50:02.028 INFO 12292 --- [ main] c.sww.eventbus.publish.EventBusHandler : post event
2019-11-03 20:50:02.044 INFO 12292 --- [ main] c.sww.eventbus.publish.EventBusHandler : post async event
2019-11-03 20:50:02.044 INFO 12292 --- [pool-1-thread-1] com.sww.eventbus.listener.EventListener : Subscribe message:MessageEvent(id=2, name=AsyncTest)

可以看到AsyncTest的线程是pool-1-thread-1,而不是main,说明确实是异步的。

代码下载

https://download.csdn.net/download/u013081610/11971245

本文系本人原创,同步更新在我的独立博客http://791202.com/上,如要转载,请注明出处!

SpringBoot+EventBus使用教程(二)的更多相关文章

  1. SpringBoot+EventBus使用教程(一)

    一.简介 EventBus是一个基于发布订阅的事件总线,在Java和Android里都可以使用. 二.使用 1.引入pom <dependency> <groupId>org. ...

  2. SpringBoot进阶教程(二十九)整合Redis 发布订阅

    SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...

  3. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  4. Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 哎呦喂,按照以往的惯例今天周六我的安排应该是待在家学学猫叫啥的.但是今年这种日子就可能一去不复返了,没法办法啊.前 ...

  5. 很详细的SpringBoot整合UEditor教程

    很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529    版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...

  6. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置

    前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...

  8. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  9. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

随机推荐

  1. 基于Vue + axios + WebApi + NPOI导出Excel文件

    一.前言 项目中前端采用的Element UI 框架, 远程数据请求,使用的是axios,后端接口框架采用的asp.net webapi,数据导出成Excel采用NPOI组件.其业务场景,主要是列表页 ...

  2. MySQL for OPS 06:备份恢复

    写在前面的话 人在河边走,湿鞋是早晚是事情,操作服务器,数据库也一样.谁也不知道自己哪一天控制不住自己就手贱.这时候有两个东西能救我们,一是备份,二是 bin log,bin log 前面讲了,但是 ...

  3. kali渗透综合靶机(十四)--g0rmint靶机

    kali渗透综合靶机(十四)--g0rmint靶机 靶机下载地址:https://www.vulnhub.com/entry/g0rmint-1,214/ 一.主机发现 1.netdiscover - ...

  4. 使用角色管理工具 安装或配置microsoft.net framework 3.5 sp1

    解决方法:

  5. EntityUtils.toString(entity)处理字符集问题解决

    爬取51Job和猎聘网的信息,想处理字符集问题(51job为gbk,猎聘为utf-8), 找到两个网站字符集信息都在同一标签下 就想先把网页保存成String,解析一遍获取字符集,然后将网页转换成对应 ...

  6. Linux之Shell编程(15)

    case: for:   while:

  7. 十七:迭代器模式详解(foreach的精髓)

    定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 从定义中可以看出,迭代器模式是为了在不暴露该对象内部表示的情况下,提供一种顺序访问聚合对象中元素的方法.这种思想在JA ...

  8. CPU体系结构(组成部分)

    在准备网络工程师考试,里面有些知识点是比较常考的.自己写这篇博客呢,当作是笔记吧,自己看一看也分享给大家一起学习. 这部分的内容就是讲CPU里面的组成结构以及各部分的功能. CPU的构成:CPU主要由 ...

  9. 电信NBIOT 4 - NB73模块上行测试(NB73-电信平台-自己平台)

    电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程) 电信NBIOT 2 - 数据上行(中间件获取电信消息通知) 电信NBIOT 3 - 数据下行 电信NBIOT 4 - NB73模块上行测 ...

  10. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...