Event-bus使用总结
1. 概述
guava中EventBus是一个消息处理总线,基于观察者模式设计和实现。主要介绍下在spring框架中如何使用和配置EventBus。
EventBus主要分为两种,一种是同步消息总线(EventBus);另一种是异步消息总线(AsyncEventBus)。
下面主要以同步消息总线为例来介绍下EventBus和Spring的结合使用。一个消息总线可以支持多种消息的订阅和发送,不同的消息通过类名来区分。消息体使用一个简单的Java DO,本身不需要继承或实现EventBus的接口。例如如下文定义的MessageEvent对象:
先引入pom
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.1.1</version>
</dependency>
先定义一个config配置Event负责创建event对象
@Configuration
public class EventConfig {
private EventBus eventBus;
@Bean(name = "eventBus")
public synchronized EventBus eventBus() {
if (null == eventBus) {
eventBus = new AsyncEventBus("testventBus", Executors.newFixedThreadPool(30));
}
return eventBus;
}
再创建一个event监听负责注册event接口,下面的Test1ServiceImpl 方法中有@Subscribe,负责处理对应对象参数的方法。
@Component
@Slf4j
public class EventListener {
@Autowired
private EventBus eventBus;
@Autowired
private Test1ServiceImpl test1Service;
@Autowired
private Test2ServiceImpl test2Service;
@PostConstruct
public void init() {
eventBus.register(test1Service);
eventBus.register(test1=2Service);
}
@PreDestroy
public void destroy() {
eventBus.unregister(activityService);
eventBus.unregister(activityMetaService);
eventBus.unregister(customerMiscService);
eventBus.unregister(messageService);
eventBus.unregister(topicService);
}
}
如下是消息处理了类,是按照@Subscribe中方法的参数类型进行处理的,下面例子处理所有消息体是MessageEvent对象的消息。
@Slf4j
@Service
public class Test1ServiceImpl implements Test1Service {
@Autowired
private MessageStoreBuilder messageStoreBuilder;
@Subscribe
public void testMessages(MessageEvent event) {
System.out.println(enent.id);
}
}
定义的event不需要继承任何对象接口,只是为了对消息进行区分,发送的和接受的是同一个对象就可以处理。
@Data
@Builder
public class MessageEvent {
private String id;
private String fromViewId;
private boolean delete = false;
}
使用时按照如下方法,在service中注入eventBus对象,然后在需要发送消息的地方利用如下方法发送即可。
eventBus.post(MessageEvent.builder().myActivityViewId(targetViewId).fromViewId(reactionEntry.getViewId()).build());
如下好文写的较好可进行参考:
https://www.cnblogs.com/shamo89/p/11774293.html