Skip to content

事件总线

钟勋 edited this page Mar 21, 2020 · 14 revisions

简介

事件总线用于在一个应用内发布事件和监听事件,类似发布订阅模式。

1. 引入事件总线依赖

<dependency>
    <groupId>org.bekit</groupId>
    <artifactId>event</artifactId>
    <version>1.3.0.RELEASE</version>
</dependency>

2. 配置

  • 如果是spring-boot项目则不需要进行任何配置。
  • 如果是非spring-boot项目则需要手动引入事件总线配置类EventBusConfiguration。比如:
@Configuration
@Import(org.bekit.event.boot.EventBusConfiguration.class)
public class MyImport {
}

3. 使用事件总线

使用事件总线步骤:1、定义事件类型,2、定义事件监听器,3、发布事件

3.1 定义事件类型

事件类型就是普通的java类,不需要实现特定接口,也不需要打上特定注解。

// 添加用户事件
public class AddUserEvent {
    // 用户id
    private String userId;
    // 用户名
    private String userName;

    public AddUserEvent(String userId, String userName) {
        this.userId = userId;
        this.userName = userName;
    }

    // 在此省略getter、setter
}

3.2 定义事件监听器

一个监听器内可以监听多种类型的事件,不同监听器可以监听同一种事件。

// 用户监听器
@DomainListener(priority = 1)  // 事件监听器注解,属性priority表示优先级
public class UserListener {
    @org.bekit.event.annotation.Listen(priorityType = PriorityType.ASC) // 监听注解(priority值越小优先级越高)
    public void listenAddUser(AddUserEvent event) {
        // 监听到新增用户事件后,执行具体业务
    }

    @org.bekit.event.annotation.Listen(priorityType = PriorityType.DESC) // 监听注解(priority值越大优先级越高)
    public void listenDeleteUser(DeleteUserEvent event) {
        // 监听到删除用户事件后,执行具体业务
    }
}

一个事件发生后监听器执行顺序:先执行@Listen中priorityType=PriorityType.ASC的监听器,并按照优先级大小(@DomainListener的priority属性)由小到大执行;再执行@Listen中priorityType=PriorityType.DESC的监听器,并按照优先级大小由大到小执行。

3.3 发布事件

在需要发布事件的地方注入事件发布器EventPublisher

@Autowired
private EventPublisher eventPublisher;

然后就可以发布事件:

// AddUserEvent是自定义的事件类型
eventPublisher.publish(new AddUserEvent("123""zhangsan"));