Guava-事件总线使用简要说明

By | 2023年8月8日

事件总线说明

在一个系统中的模块众多而逻辑又互相耦合的情况下,那么为了解耦合可以通过事件或者消息的形式来完成沟通。如果业务量较大可以搭建消息中间件来完成,比如ActiveMQRabbitMQ等等;如果业务量小又不涉及分布式部署的情况下可以选择事件总线的形式。

事件总线机制采用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"));
 }

}