原文网址:Spring Event--踩坑(注意事项)-CSDN博客
简介
本文介绍Spring的事件的使用注意事项。
Spring Event框架实现了基于事件的发布订阅机制。开发者可以自定义事件,发布事件,Spring 会将该事件广播给监听该事件的监听者。监听者可以实现Spring 的监听者接口 ApplicationListener注册自己,也可以使用 EventListener注解注册自己。
但是,Spring Event不要随便用!有很多注意事项。
1.必须实现优雅关闭服务
Spring 广播消息时会在 ApplicationContext 中查找所有的监听者:通过 getBean 获取 bean 实例。但Spring 有个限制:ApplicationContext 关闭期间,不要getBean,否则会报错。
前几天,线上系统出现两条异常日志:Get Bean时找不到对应的bean:
堆栈中的信息为:Do not request a bean from a BeanFactory in a destroy method implementation
原因分析
这个问题出现在服务关闭期间,在应用上下文关闭时,此Bean已被销毁,从上下文中Get Bean,结果没有获取到Bean,导致报错。
由于系统流量较高,日订单几百万,即便在低峰期单机的并发度也是比较高的,所以服务在关闭期间有少量流量进来或未处理完。这个场景下,使用 Spring Event 发布事件,一定会出现异常,导致处理失败!
大家一定要切记!使用 SpringEvent 之前,一定要先治理服务,确保服务关闭时,先切断入口流量(Http、MQ、RPC),然后再关闭服务,关闭 Spring 上下文!
2. 服务启动时,Spring 事件可能丢失
上边是文章的部分内容,为统一维护,全文已转移到此网址:Spring Event-踩坑(注意事项) - 自学精灵