-
Notifications
You must be signed in to change notification settings - Fork 3k
事件驱动
zhōuhào edited this page Jun 5, 2018
·
1 revision
一个典型的场景,在完成了某项业务A
之后,要向用户发送通知,可能系统建设刚开始只需要发送站内信,后来又要发送邮件,再后来又要发送短信.按照传统的做法,在service
方法中添砖加瓦显然不够灵活.
这时候可以使用事件通知的方式对主线业务(业务A
)里存在的支线业务(发送短信
,发送邮件等
)进行解耦,这样主线业务只需要关系自己应该做的就行了.做完服务自己该做的,然后发送一个通知(事件生产者
),告诉别人(事件消费者
)某个业务完成了,至于接下来要干什么,由订阅了该事件的消费者
自己去实现.
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
更多用法,查看此注解源代码即可.