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


原网址: 访问
创建于: 2021-01-21 15:49:45
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论