前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@RefreshScope能随便用嘛

@RefreshScope能随便用嘛

作者头像
伍六七AI编程
发布2022-03-23 14:04:04
9650
发布2022-03-23 14:04:04
举报
文章被收录于专栏:prepared

最近在使用COLA框架自带的异步任务时,发现每次执行异步都执行了两次,如果一些没有做幂等的接口,这样是会有问题的,比如入库操作之类的,就会造成数据重复入库,造成严重bug。

带着疑惑,开始了 bug 之旅。

1 问题发现

1、首先排查执行入口,是不是有两个,发现只有一个;

2、调用入口的问题?直接通过controller调用handler,还是调用了两次。

3、简化代码,把handler内的内容都删掉,只有一个logger打印语句?结果还是打印了两次。

但是这次,发现logger的线程名不一样,是两个线程。

代码语言:javascript
复制
2021-07-26 14:11:19.429  INFO 47294 --- [pool-4-thread-2] c.e.colademo.event.handler.TestHandler   : >>>>>>>>>>>>> 0
2021-07-26 14:11:19.430  INFO 47294 --- [pool-4-thread-1] c.e.colademo.event.handler.TestHandler   : >>>>>>>>>>>>> 0

2 问题排查

为什么会有两个线程同时执行呢?查看COLA源码。

代码语言:javascript
复制
public void asyncFire(EventI event) {
    this.eventHub.getEventHandler(event.getClass()).parallelStream().map((p) -> {
        Response response = null;

        try {
            if (null != p.getExecutor()) {
                p.getExecutor().submit(() -> {
                    return p.execute(event);
                });
            } else {
                this.defaultExecutor.submit(() -> {
                    return p.execute(event);
                });
            }
        } catch (Exception var5) {
            response = this.handleException(p, response, var5);
        }

        return response;
    }).collect(Collectors.toList());
}

提交异步任务,最终都走到上面的代码,将任务提交到线程池执行,如果没有自定义线程池,那么会提交到defaultExecutor 这个默认线程池中。

发现提交了两遍,查看this对象中的内容,==发现Event对象和Handler对象都有两个==。

图1-线程池对象
图1-线程池对象

3 问题原因

是什么原因会造成重复对象呢?

对比之前的handler对象,这个对象唯一的不同就是使用@RefreshScope,查看注解源码,发现使用了==这个注解的对象,都会使用代码创建一个新的对象,并缓存起来==,debug源码,查看缓存的对象。

图2-Scope缓存对象
图2-Scope缓存对象

发现的确有TestHandler对象,对象为@12349。

对比图1中的handler对象,里面也有一个TestHandler对象,对象也是@12349.

原来如此,因为使用了注解@RefreshScope,这个注解会创建一个对象,这样就会有两个相同的对象,造成重复执行。

结论:使用注解@RefreshScope需要注意,最好把获取配置的内容放在单独的property对象中,不要和其他代码混用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 问题发现
  • 2 问题排查
  • 3 问题原因
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档