SpringBoot+EventBus使用教程(二)
简介
继续上篇,本篇文章介绍如何集成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使用教程(二)的更多相关文章
- SpringBoot+EventBus使用教程(一)
一.简介 EventBus是一个基于发布订阅的事件总线,在Java和Android里都可以使用. 二.使用 1.引入pom <dependency> <groupId>org. ...
- SpringBoot进阶教程(二十九)整合Redis 发布订阅
SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...
- SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1
在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...
- Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 哎呦喂,按照以往的惯例今天周六我的安排应该是待在家学学猫叫啥的.但是今年这种日子就可能一去不复返了,没法办法啊.前 ...
- 很详细的SpringBoot整合UEditor教程
很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置
前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
随机推荐
- laravel 广播细节讲解
1.应用场景 1.通知(Notification) 或 信号(Signal) 2.通知是最简单的示例,也最经常用到.信号也可看作是通知的一种展现形式,只不过信号没有UI而已. 3.Activity S ...
- LOOP AT GROUP语法练习
DATA:P_MENGE TYPE EKKO-WKURS. DATA:P_MENGE1 TYPE EKKO-WKURS. SELECT * FROM EKKO INTO TABLE @DATA(LT_ ...
- WPF ItemsSource Order by Getter
public ObservableCollection<CustomerModel> CustomerCollection { get { if(customerCollection!=n ...
- WPF-数据模板深入(加载XML类型数据)
一.我们知道WPF数据模板是当我们给定一个数据类型,我们为这个数据类型写好布局,就给这种数据类型穿上了外衣. 下面这个例子,能够帮助大家充分理解数据模板就是数据类型的外衣的意思:(里面的MyListB ...
- ASP.NET Core Web 项目文件
在本节中,我们将探索并了解 asp.net core 项目文件. 我们使用 C#作为编程语言,因此项目文件具有.csproj 扩展名. 如果您使用过以前版本的 ASP.NET,那么您可能对此文件非常熟 ...
- QT4.8.7和VS2010环境搭建及使用
(一)环境搭建 首先下载QT4.8.7的安装包.QT Addin 1.11插件和VS2010安装包.第一步:安装好VS2010第二步:安装QT4.8.7(qt-opensource-windows-x ...
- hadoop 完全分布式集群搭建
1.在伪分布式基础上搭建,伪分布式搭建参见VM上Hadoop3.1伪分布式模式搭建 2.虚拟机准备,本次集群采用2.8.3版本与3.X版本差别不大,端口号所有差别 192.168.44.10 vmho ...
- Linux命令: ps
STAT 进程状态 S-睡眠 s-进程是会话向导进程 N拥有比普通优先级更低的 R-正在运行 D-短期等待 Z-僵尸进程 T被跟踪或者被停止 STATED 进程启动时间 TIME 进程使用CPU时间 ...
- mac上配置python的安装环境杂记
现在的python的包都是通过pip安装的. 所以非常重要的一步是配置pip的安装源 vi ~/.pip/pip.conf [global] index-url = http://pypi.douba ...
- Redis缓存实战教程
目录 Redis缓存 使用缓存Redis解决首页并发问题 1.缓存使用的简单设计 2.Redis的整合步骤 A 将Redis整合到项目中(Redis+Spring) B 设计一个数据存储策越 3.Re ...