SpringBoot内置的事件发布与订阅

SpringBoot内置的事件发布与订阅

1.了解Spring框架中的事件机制

在 Spring 框架中,事件机制是通过ApplicationEventApplicationListener接口实现的。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));

猜你喜欢

转载自blog.csdn.net/2302_77276867/article/details/143097781