Skip to content

事件驱动

zhōuhào edited this page Jun 5, 2018 · 1 revision

使用事件来进行服务解耦

一个典型的场景,在完成了某项业务A之后,要向用户发送通知,可能系统建设刚开始只需要发送站内信,后来又要发送邮件,再后来又要发送短信.按照传统的做法,在service方法中添砖加瓦显然不够灵活.

这时候可以使用事件通知的方式对主线业务(业务A)里存在的支线业务(发送短信,发送邮件等)进行解耦,这样主线业务只需要关系自己应该做的就行了.做完服务自己该做的,然后发送一个通知(事件生产者),告诉别人(事件消费者)某个业务完成了,至于接下来要干什么,由订阅了该事件的消费者自己去实现.

Spring Event Listener

hsweb推荐使用Spring自带的EventListener来进行事件的订阅和发布,如果要向进程外发布事件,例如:消息队列. 新建一个EventListener进行转发即可.

定义事件

新建一个普通bean,包含事件需要的属性即可,如:

@Getter
@AllArgsConstructor
public class OrderCreatedEvent{

 private Order order;

}

发布事件

Service中注入ApplicationEventPublisher

@Autowired
private ApplicationEventPublisher eventPublisher;

public String createOrder(Order order){
   
  //一些逻辑...
 
  //发布事件OrderCreatedEvent事件
  eventPublisher.publishEvent(new OrderCreatedEvent(order));
}

监听事件

新建一个类,注解@Component, 新建一个方法注解@EventListener

@Component
public class OrderCreateListener{

   @EventListener //监听OrderCreatedEvent事件,注意:参数就是事件类型
   public void handleOrderCreateEvent(OrderCreatedEvent event){
      Order order = event.getOrder();
      //执行发送短信等操作
   }
}

以上例子就完成了简单的事件发布以及监听.

⚠️: 如果想在事务提交后才触发事件,可以使用@TransactionalEventListener 更多用法,查看此注解源代码即可.

hsweb 3.0

 3.0,全新的架构
 模块化,更细,更轻
 吸取经验,优化功能
  1. 增删改查
  2. 权限控制
  3. 访问日志
  4. 动态数据源
  5. 常用并发工具
  6. 消息封装
  7. 其他工具
Clone this wiki locally