使用场景:

在list数据进来之后使用安全数组    Lists.newCopyOnWriteArrayList()

进行了   parallelStream  并行处理,在接口中进行了登录者信息接口的调用,获取方式是从当前登录的requst中获取用户携带的session信息,在并行处理的过程中出现调用NPE异常信息。

问题排查:

public static ServletRequestAttributes getRequestAttributes() {

RequestAttributes attributes = RequestContextHolder.getRequestAttributes();

return (ServletRequestAttributes)attributes;

}

上述方法中 RequestContextHolder.getRequestAttributes(); 获取到的是NULL对象,来源于

@Nullable

public static RequestAttributes getRequestAttributes() {

RequestAttributes attributes = (RequestAttributes)requestAttributesHolder.get();

if (attributes == null) {

attributes = (RequestAttributes)inheritableRequestAttributesHolder.get();

}

return attributes;

}

上述方法中获取方式:

(RequestAttributes)requestAttributesHolder.get();或者

RequestAttributes)inheritableRequestAttributesHolder.get();

出现了null空值,原因是子线程获取了当前线程组中的参数为空:

private static final ThreadLocal requestAttributesHolder = new NamedThreadLocal("Request attributes");

private static final ThreadLocal inheritableRequestAttributesHolder = new NamedInheritableThreadLocal("Request context");

具体的实现是:

public T get() {

Thread t = Thread.currentThread();

ThreadLocalMap map = getMap(t);

if (map != null) {

ThreadLocalMap.Entry e = map.getEntry(this);

if (e != null) {

@SuppressWarnings("unchecked")

T result = (T)e.value;

return result;

}

}

return setInitialValue();

}

执行了最后的

setInitialValue();方法,此方法中返回了null;传递至其调用方法造成的NPE异常;

原因

主线程中request对象在创建子线程并行执行的时候没有将request对象共享给子线程,导致的null空指针,具体原因可参考request和response设置的底层实现;

解决办法

1.监听所有的请求,以监听器处理;初始化的时候添加请求监听器;

/**

* 监听器:监听HTTP请求事件

* 解决RequestContextHolder.getRequestAttributes()空指针问题

* @return

*/

@Bean

public RequestContextListener requestContextListener(){

return new RequestContextListener();

}

2.将当前线程的变量共享给子线程;并行请求开始的前先做变量共享。

ServletRequestAttributes servletRequst= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

RequestContextHolder.setRequestAttributes(servletRequst,true);

java 迅雷下载 session丢失_关于java并发场景下,HttpServletRequst中session丢失问题相关推荐

  1. java每秒向mysql写一条记录_【Java】mysql一条记录在高并发场景下读写?

    CREATE TABLE `user_info` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `balance` decimal(10,2) DE ...

  2. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  3. java 多态判断非空_收藏Java 面试题全梳理

    脚本之家 你与百万开发者在一起 来源 | Java建设者(ID:javajianshe) 作者 |cxuan 如若转载请联系原公众号 Java 基础篇 Java 有哪些特点 并发性的:你可以在其中执行 ...

  4. java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

  5. java currenttimemillis 效率_高并发场景下System.currentTimeMillis()的性能问题的优化

    前言 System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我也不知道,不过听说在100倍左右),然而该方法又是一个常用方法,有时不得不使用,比如生 ...

  6. 读数据库遇到空就进行不下去_如何解决高并发场景下缓存+数据库双写不一致问题?...

    推荐阅读: 一只Tom猫:手撕分布式技术:限流.通讯.缓存,全部一锅端走送给你!​zhuanlan.zhihu.com 一只Tom猫:MySQL复习:20道常见面试题(含答案)+21条MySQL性能调 ...

  7. java web 开发之道_《Java Web开发之道》PDF 下载

    图书目录: 第1篇  编程 经验与 感悟篇 第1章  编程 经验谈6则 经验01  乐不思蜀--寻找编程的乐趣 经验02  水滴石穿--编程学习 经验谈 经验03  举足轻重--代码规范 经验谈 经验 ...

  8. java 解析m3u8的实例_使用java线程池批量下载m3u8。合并mp4.

    使用java线程池批量下载m3u8合并mp4. 看了线程池的demo,然后就想下载文件试试. 代码未必规范,多多建议. 大家可以自行修改,满足自己的需求. 还需要深入学习一下线程池. 给俺个星星⭐,可 ...

  9. java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...

    (一) 如果在迅雷的下载对话框中点取消,则会使用IE的下载,这里的文件又是正确的了: 怀疑迅雷是根据下载对话框中的网址重新请求下载,与发起请求的页面已经无关,而IE又不会把ViewState信息传到迅 ...

  10. java迅雷下载excel,用servlet实现excel文件下载,用迅雷下载时文件名有关问题

    用servlet实现excel文件下载,用迅雷下载时文件名问题 用servlet实现的excel下载,在用浏览器直接下载时,获得的文件名是设置在header中的文件名, 但如果用迅雷下载,生成的文件名 ...

最新文章

  1. 一份来自山东院校的考研调剂系统已开放名单!
  2. 自动驾驶中的3D物体状态检测
  3. 图像拼接--Construction and Refinement of Panoramic Mosaics with Global and Local Alignment
  4. apache2.0性能优化
  5. Flask + Nginx + React + Webpack 配置解决跨域问题
  6. python 爬取贝壳网小区名称_利用python爬取贝壳网租房信息
  7. PostgreSQL 与 MySQL 相比,优势何在?[转]
  8. linux 系统调用会被信号打断的
  9. mysql中括号_《MySQL数据库》SQL简介、语法格式
  10. iOS显示性能优化过程讲解
  11. Delphi7函数大全
  12. Java类的执行顺序
  13. 用PHP玩百万英雄类型游戏!!!
  14. iOS 人民币符号与日圆符号的混淆
  15. Android学习笔记27:网格视图GridView的使用
  16. error: possibly undefined macro: LT_SYS_SYMBOL_USCORE please use m4_pattern_allow
  17. Codeforces Round #573 (Div. 2)
  18. 雷达一维距离像怎么用matlab仿真出来,雷达目标识别之一维距离像的学习
  19. 使用Windows批处理+ImageMagick 实现批量处理图片
  20. 秀米中如何添加链接、文件链接、小程序链接?

热门文章

  1. AVPlayer没声音
  2. 为什么说流程自动化机器人是AI落地的“接盘侠”?
  3. 关于《概率论与数理统计》最全参数估计总结
  4. 【视频】认证测试第1期:鸿蒙智联设备认证整体介绍
  5. php 上传 enctype,动态设置上传文件的enctype
  6. Bug有哪些分类和等级?
  7. 【spring框架28】spring之packagesToScan
  8. 大公司 Or 小公司?
  9. python appium api_appium api文档
  10. appium python api_Appium常用的API函数