看麻了呀,线程池日志错乱问题

一、背景

由于推送业务的历史问题,推送业务代码比较散乱,推送日志也不方便查看,推送模型也不够统一,因此专门设计一个核心模块来逐步替换掉之前的推送业务代码,进行统一管理

二、问题描述

通过线程池抓取数据后进行组装然后推送给业务方,在推送过程中出现整个日志上下文打印错乱的问题,
如A线程持有的上下文参数对象,在B线程的日志中被打印出来了。
在测试case中,有三类数据要被推送,不同类型的数据被分到同一个线程池的不同线程处理,
如下(正常情况):
A类数据—>T1线程处理–>T1线程日志展示A类数据的上下文信息(如类型信息,list大小,查询条件内容等等)
B类数据—>T2线程处理–>T2线程日志展示B类数据的上下文信息(如类型信息,list大小,查询条件内容等等)
C类数据—>T3线程处理–>T3线程日志展示C类数据的上下文信息(如类型信息,list大小,查询条件内容等等)
但是在日志显示上是错乱的,如下:
A类数据—>T1线程处理–>T1线程日志展示A类数据的上下文信息(如类型信息,list大小,查询条件内容等等)+部分B类数据的上下文信息(如list大小,查询条件内容)
B类数据—>T2线程处理–>T2线程日志展示B类数据的上下文信息(如类型信息,list大小,查询条件内容等等)+部分A类数据的上下文信息(如list大小,查询条件内容)
C类数据—>T3线程处理–>T3线程日志展示C类数据的上下文信息(如类型信息,list大小,查询条件内容等等)

上面的是打印日志方面的问题,但是实际上在测试过程中整个数据推送流程没有问题,因此当时第一阶段上线前并没有太在意,上线之后也没有问题,但是至于为啥会错乱,肯定需要排查的。

三、排查思路

3.1 并发问题

第一印象是觉得可能出现了并发问题,因此在关键方法上加了锁,重新发了一版之后生效了,但是后面又出现了,所以这个方向不对。

3.2 trace问题

由于是xxljob触发调度,在调度过程中没有统一的trace信息,因此加上了,最初也是怀疑是因为aop+MDC trace导致的,另外之前也看过trace多线程日志错乱问题,但是明显跟我这个场景不一样,在业务代码中注释了引入的trace代码之后还是存在问题,所以这个方向也排除了。

3.3 其他问题

  1. 配置问题
  2. 嵌套调用

另外也通过上面的方向排查了,没啥思路。

3.4 问题场景回归

每个线程只处理一类数据,上下文是隔离的,但是当前日志的内容却打印了别的类型的数据,明显出现错乱,所以可能是组装数据的上下文不是纯隔离的。如下代码:

   /**
     * 推送
     * @param pushDataContext
     */
    private void exePush(PushDataContext pushDataContext){
   
        Map<Long, List<PushTaskMain>> pushTaskGroupMap = pushDataContext.getPushTaskList()
  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RecyclerView图片错乱问题通常出现在滑动过程中,这是由于RecyclerView的回收复用机制导致的。 RecyclerView的回收复用机制可以提高列表的滑动效率,但在复用过程中有可能出现图片错乱问题。这是因为复用的View可能会带有之前加载的图片或者其他数据,而在新的位置显示时,没有及时更新内容。 解决RecyclerView图片错乱问题的方法有以下几种: 1. 使用ViewHolder设计模式:在ViewHolder中,通过getItemViewType()方法判断当前Item所属类型,然后根据不同的类型进行相应的数据加载和图片显示操作。这样可以确保复用的View正确显示对应位置的内容,避免图片错乱问题的发生。 2. 使用图片加载框架:如Glide或Picasso等,这些图片加载框架可以自动处理图片加载、缓存和显示等问题,避免出现图片错乱的情况。可以使用框架提供的方法,在加载图片前对ImageView进行重置,确保显示正确的图片。 3. 设置数据标记:在数据源中为每个Item设置唯一标识,可以使用position作为标识。在加载图片时,将标识与ImageView绑定,只有当标识匹配时才进行图片加载和显示操作。这样可以确保每个ImageView只显示对应标识的图片,避免图片错乱。 4. 及时取消加载:在RecyclerView滑动过程中,可以对滑动过程中无需显示的Item进行图片加载的取消操作,避免加载到错误的图片。可以通过监听滑动事件,在滑动停止时再进行图片加载。 通过以上方法可以有效地解决RecyclerView图片错乱问题,保证列表的显示正确性。在实际开发中,根据具体的情况选择合适的解决方案,并进行适当的优化,保证App的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值