ApplicationEventPublisher使用
banner 2021-10-25 16:32:46 SpringBootEvent
Spring的事件发布(ApplicationEventPublisher)和事件订阅(ApplicationListener)
观察者模式 是事件驱动模型在设计层面的体现。
# 一、同步情况下的使用
# 1.1 事件
@Data
public class Event {
private String id;
}
1
2
3
4
2
3
4
# 1.2 ApplicationListener 观察者
@Component
@Slf4j
public class Listener {
@EventListener(Event.class)
public void listener(Event event) {
log.info("listener....");
log.info("id:{}", event.getId());
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 1.3 ApplicationEventPublisher 事件发布者
@Resource
private ApplicationEventPublisher applicationEventPublisher;
@Test
public void contextLoads() {
log.info("开始");
applicationEventPublisher.publishEvent(new Event(UUID.randomUUID().toString().replace("-", "")));
log.info("结束");
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 测试一下结果
2021-10-25 16:46:31.022 INFO 48203 --- [ main] t.b.r.SpringbootRabbitmqApplicationTests : 开始
2021-10-25 16:46:31.022 INFO 48203 --- [ main] top.banner.rabbitmq.Listener : listener....
2021-10-25 16:46:31.022 INFO 48203 --- [ main] top.banner.rabbitmq.Listener : id:7f00ed4b03ae4a54b2a7604f68a98d24
2021-10-25 16:46:31.024 INFO 48203 --- [ main] t.b.r.SpringbootRabbitmqApplicationTests : 结束
1
2
3
4
2
3
4
🤯 事件发布者发布事件后,观察者监听后执行自定义逻辑。但是这里是同步的,很多时候,事件发布者发布事件后,我们希望观察者异步去处理。所以我们要开启异步监听。
# 二、异步情况下的使用
# 2.1 配置@EnableAsync开启异步
在启动类上启用 Spring 的异步方法执行功能
# 2.2 在EventListener上加上 @Async 将方法标记为异步执行
@Component
@Slf4j
public class Listener {
// 将方法标记为异步执行
@Async
@EventListener(Event.class)
public void listener(Event event) {
log.info("listener....");
log.info("id:{}", event.getId());
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2.3 测试一下
2021-10-25 16:54:35.156 INFO 74763 --- [ main] t.b.r.SpringbootRabbitmqApplicationTests : 开始
2021-10-25 16:54:35.160 INFO 74763 --- [ main] t.b.r.SpringbootRabbitmqApplicationTests : 结束
2021-10-25 16:54:35.166 INFO 74763 --- [ task-1] top.banner.rabbitmq.Listener : listener....
2021-10-25 16:54:35.166 INFO 74763 --- [ task-1] top.banner.rabbitmq.Listener : id:79f40ae9c4ac408f8f0232138c784a41
1
2
3
4
5
2
3
4
5
🤯 通过日志,可以看出异步情况下,发布和观察者是由两个线程去完成的。而同步情况下,都是由main线程去完成的。