@EventListener(ContextRefreshedEvent.class)导致重复执行的问题

突然临时介入排查、解决问题。

问题

HttpURLConnection请求指定url请求过多导致报错。

原因

使用@EventListener(ContextRefreshedEvent.class),服务启动、Spring加载时导致重复执行方法、触发大量开启线程,不同线程发起不同HttpURLConnection连接和请求,导致因请求过多而连接、限流异常,报错(不清楚使用@EventListener(ContextRefreshedEvent.class)的背景和考虑)。

解决

1、通过过滤异常请求错误信息、增加请求间隔时间、关闭报错线程(通过Thread.interrupt()发送中断信号)、增加线程池核心线程最大线程等,问题减轻但仍存在。

2、由使用ApplicationRunner解决。

3、改用ApplicationReadyEvent。(未尝试)‌该事件仅在应用完全就绪后触发一次,适合不依赖动态刷新的初始化场景。

4、改用xxl-job。

5、其他。

分析

EventListener(ContextRefreshedEvent.class)反复执行原因可能有:

(1)Nacos配置刷新触发上下文重启(配置无变更、无此可能)

Nacos通过HTTP长轮询向服务端发起请求,服务端若检测到配置变更发布RefreshEvent,导致Spring Cloud刷新@RefreshScope标记的Bean,并可能间接触发ApplicationContext的刷新操作,从而多次发布ContextR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李景琰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值