• 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/上,如要转载,请注明出处!

  • 相关阅读:
    Java菜鸟之java基础语法,运算符(三)
    Lotus迁移到Exchange 2010 POC 之Domino Server的配置!
    hibernate:对于java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误解决办法
    【targeting学习笔记】Display Advertising Targeting
    Domino 迁移到Exchange 之 Domino Admin 安装!
    sqlite3使用详解(Qt版本)
    .net反混淆脱壳工具de4dot的使用
    破解NET的四大神器(转)
    C#让应用程序只运行一个实例的几种方法
    Windows server 2008 R2实现多用户远程连接
  • 原文地址:https://www.cnblogs.com/shamo89/p/11789158.html
Copyright © 2020-2023  润新知