SpringBoot内置的事件发布与订阅
1.了解Spring框架中的事件机制
在 Spring 框架中,事件机制是通过ApplicationEvent
和ApplicationListener
接口实现的。ApplicationEvent
是所有事件类的基类,而ApplicationListener
是事件监听器的接口。当一个事件被发布时,所有监听该事件的监听器都会被通知到,并且可以执行相应的逻辑。
首先定义一个事件(这里是阅读量加一的事件)
@Getter
public class ReadArticleEvent extends ApplicationEvent {
/**
* 文章 ID
*/
private Long articleId;
public ReadArticleEvent(Object source, Long articleId) {
super(source);
this.articleId = articleId;
}
}
需要继承ApplicationEvent,因为阅读文章加一所以需要传入一个id来实现对阅读量加一的操作
创建消费者
@Component
@Slf4j
public class ReadArticleSubscriber implements ApplicationListener<ReadArticleEvent> {
@Autowired
private ArticleMapper articleMapper;
@Override
@Async("threadPoolTaskExecutor")
public void onApplicationEvent(ReadArticleEvent event) {
// 在这里处理收到的事件,可以是任何逻辑操作
Long articleId = event.getArticleId();
// 获取当前线程名称
String threadName = Thread.currentThread().getName();
log.info("==> threadName: {}", threadName);
log.info("==> 文章阅读事件消费成功,articleId: {}", articleId);
articleMapper.increaseReadNum(articleId);
}
}
ReadArticleSubscriber
订阅者需实现自 ApplicationListener
, 泛型用于指定订阅哪个事件
在 onApplicationEvent()
方法中编写阅读量 +1 的逻辑。方法的头部添加了 @Async("threadPoolTaskExecutor")
异步注解,表示该方法将通过异步线程来执行,使用的是名为 threadPoolTaskExecutor
的线程池
然后在需要阅读量加一的地方发布事件就可以了
@Autowired
private ApplicationEventPublisher eventPublisher;
// 发布文章阅读事件
eventPublisher.publishEvent(new ReadArticleEvent(this, articleId));