SpringBoot 事件机制使用方式与特性讲解

使用场景

常见于 业务处理完之后 (推送、邮件、钉钉、短信) 等通知, 也可用于业务解耦

例如: A表 为主表 BCD表 为附属表

那么 A表 数据进行删除, 一般做法是 A表 导入BCD表 的Service进行关联删除

那么我们可以用事件通知 进行解耦操纵

A表 删除后发布 主表删除事件 , BCD监听到删除事件, 各自处理各自的删除逻辑

这样 A表 无需关心 BCD表 如何进行删除,  BCD表 也只需要处理自己的删除逻辑即可

有些人可能担心事务问题, 这里可以说明 (经过验证) 事件都是在同一个线程进行的

只要在 A表 删除的方法上增加事务注解即可

发布事件

首先定义事件实体类

/**
 * 事件实体
 * 
 * @author Lion Li
 */

@Data
public class MyEvent {
  private String eventId;
}

编写测试Controller接口

/**
 * 测试接口
 * 
 * @author Lion Li
 */

@RestController
public class TestDemoController {

    @Autowired
    private ApplicationContext context;

    @GetMapping("/test")
    public String test(String eventId) {
      MyEvent event = new MyEvent();
      event.setEventId(eventId);
      context.publishEvent(event);
      return "success";
    }
}

监听事件

/**
 * 监听事件
 * 
 * @author Lion Li
 */

@Component
public class TestEventListener {

    @EventListener
    public void listener1(MyEvent event) {
       System.out.println(event.getEventId());
    }

    /**
     * 异步需要在主方法添加 @EnableAsync 注解
     */

    @Async
    @EventListener
    public void listener2(MyEvent event) {
       System.out.println(event.getEventId());
    }
}

基于事务发布事件

@TransactionalEventListener 注解可以监听事务的动态决定是否处理事件

作用域如下:

TransactionPhase.BEFORE_COMMIT 在提交前(默认)

TransactionPhase.AFTER_COMMIT 在提交后

TransactionPhase.AFTER_ROLLBACK 在回滚后

TransactionPhase.AFTER_COMPLETION 在事务完成后

此注解是无法保证原子性的 属于在事务之外


原文始发于微信公众号(狮子领域 程序圈):SpringBoot 事件机制使用方式与特性讲解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/215092.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!