事件总线说明
在一个系统中的模块众多而逻辑又互相耦合的情况下,那么为了解耦合可以通过事件
或者消息
的形式来完成沟通。如果业务量较大可以搭建消息中间件来完成,比如ActiveMQ
、RabbitMQ
等等;如果业务量小又不涉及分布式部署的情况下可以选择事件总线
的形式。
事件总线机制采用Guava
来实现。
使用方法
注册事件总线对象
/**
* 事件总线配置类
*/
@Configuration
public class EventBusConfig {
/**
* 初始化一个通用的事件总线对象
*
* @return EventBus 通用事件总线对象
*/
@Bean
public EventBus eventBus() {
return new EventBus();
}
}
各个模块在同一个eventBus
对象上进行事件的发布和监听
创建事件对象
每类事件创造自己的事件对象,以便携带自己的业务信息数据。
/**
* 存储变化事件
*/
@Getter
public class FileChangedEvent {
// 发生存储变化的用户标识
private String userId;
// 发生存储变化的机构标识
private String orgId;
/**
* 构造一个存储发生变化的事件对象
*
* @param userId 发生存储变化的用户标识
* @param orgId 发生存储变化的机构标识
*/
public FileChangedEvent(String userId, String orgId) {
this.userId = userId;
this.orgId = orgId;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("{");
sb.append("userId:").append(userId);
sb.append(",orginId:").append(orgId);
sb.append("}");
return sb.toString();
}
}
事件监听(处理)
为该事件创建对应的监听处理对象,并注册到事件总线上
/**
* 存储变化事件监听处理对象
*/
@Slf4j
@Component
public class FileChangedListener {
@Autowired
private EventBus eventBus;
@PostConstruct
public void init() {
// 注册
eventBus.register(this);
}
// 监听到对象后的处理过程
@Subscribe
public void listenStorageChanged(FileChangedEvent event) {
log.info(event.toString());
}
}
事件发布
通过全局的eventBus
对象post
合适的事件对象即可
public class EventTest extends BaseLocalTest {
@Autowired
EventBus eventBus;
@Test
public void test() {
eventBus.post(new FileChangedEvent("userId2", "orgId3"));
}
}