异步调用方法在子线程访问RequestContextHolder,获取request

@Async注解会开启一个子线程,此时如果要获取请求的session是获取不到,RequestContextHolder.getRequestAttributes返回null。

根据https://segmentfault.com/q/1010000016720112里面提供的方法改写:

异步调用方法在子线程访问RequestContextHolder,获取request_第1张图片

在子线程里这样获取,试了下当时可以获取,可偶尔还会出现对象丢失的现象。

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
LoginSessionInfo sessionInfo = (LoginSessionInfo)request.getSession().getAttribute(Consts.SESSION_LOGIN_NAME);

 一通搜索,感觉下面的博客说的很有道理:

https://www.cnblogs.com/liuqingsha3/p/9144122.html

 异步调用方法在子线程访问RequestContextHolder,获取request_第2张图片

 另外这边文章也值得看下

详解Spring框架下向异步线程传递HttpServletRequest参数的坑

目前的解决办法是将需要使用的参数从request中取出来,这样即使request对象销毁,由于该参数还存在着引用,所以还是会保留的。

你可能感兴趣的:(工作笔记)