我是靠谱客的博主 安静面包,最近开发中收集的这篇文章主要介绍Spring中的事件发布与订阅机制的应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

Spring中的事件发布与订阅机制,对应的其实就是设计模式中的观察者模式典型应用,可以针对一对多关系进行解耦。此处,我利用该机制,自己实现了一套简单的MQ,供学习参考。

具体实现

  • 定义事件:继承ApplicationEvent即可
/**
* @author qinchen
* @date 2021/6/2 14:43
* @description TODO
*/
public class EbsMQEvent extends ApplicationEvent {
private String subject;
private String jsonBody;
public EbsMQEvent(Object source) {
super(source);
}
public EbsMQEvent(Object source, String subject, String jsonBody) {
super(source);
this.subject = subject;
this.jsonBody = jsonBody;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getJsonBody() {
return jsonBody;
}
public void setJsonBody(String jsonBody) {
this.jsonBody = jsonBody;
}
}
  • 在消息的生产者实现中,发送消息处调用发布消息
  • 事件发布者需要注入并使用 ApplicationEventPublisher 发布事件
  • 也可以直接使用 ApplicationContext 发布事件,因为它继承了 ApplicationEventPublisher 接口

@Autowired
private WebApplicationContext webApplicationContext;
public void send(String subject, String jsonBody){
log.info(">>>>> Use DefaultMQ to send messages, subject = {}, jsonBody = {}", subject, jsonBody);
// 发布自定义MQ事件,在DefaultMqListener中监听该事件
webApplicationContext.publishEvent(new EbsMQEvent(this, subject, jsonBody));
}
  • 也可直接注入ApplicationEventPublisher,调用其publishEvent方法即可
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
  • 事件监听器需要实现 ApplicationListener 接口,也可以使用注解 @EventListener (推荐)
@Component
public class EbsMQEventListener implements ApplicationListener<EbsMQEvent> {
/**
* 监听到MQ消息发送事件
*
* @param mqEvent
*/
@Override
public void onApplicationEvent(EbsMQEvent mqEvent) {
...
}
}
  • 使用注解的方式:
@EventListener
public void handler(EbsMQEvent mqEvent){
}

异步事件

以上监听器监听到事件并执行了 @EventListener 注解的方法后,你会发现主线程的 publish 方法是阻塞执行,会等待监听方法执行完后才会继续往下执行。说明是同步的,比如用于事务一致性场景适合,但有些时候,我们不关心事件订阅方处理结果,如何让事件处理变成异步呢?

  • 解决方案也很简单,利用Spring提供的异步机制即可
  • 在监听器方法上增加,@Async,主启动类上增加@EnableAsync注解即可

/**
* 监听到MQ消息发送事件
*
* @param mqEvent
* 添加@Async注解,异步处理,注意主启动类上要添加@EnableAsync注解,开启异步支持
*/
@Override
@Async
public void onApplicationEvent(EbsMQEvent mqEvent) {
...
}

原理

  • Spring Events 从实现原理上讲,所有观察者继承一个包含触发方法的父类,并重写该方法,然后注册到被观察者的一个列表中。
  • 当被观察者发生变化时,通过调用列表中所有已注册观察者的触发方法,使观察者得到通知,从而作进一步处理。
  • 具体可以去看相关源码:

com.alibaba.spring.context.event.DeferredApplicationEventPublisher#publishEvent(java.lang.Object)

最后

以上就是安静面包为你收集整理的Spring中的事件发布与订阅机制的应用的全部内容,希望文章能够帮你解决Spring中的事件发布与订阅机制的应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部