七叶笔记 » java编程 » SpringBoot详细讲解异步任务如何获取HttpServletRequest

SpringBoot详细讲解异步任务如何获取HttpServletRequest

原因分析 @Anysc注解会开启一个新的线程,主线程的Request和子线程是不共享的,所以获取为null在使用springboot的自定带的线程共享后,代码如下,Request不为null,但是偶发的其中body/head/urlparam内容出现获取不到的情况,是因为异步任务在未执行完毕的情况下,主线程已经返回,拷贝共享的Request对象数据被清空

解决方案

前置条件 启动类添加@EnableAsync注解标记@Async的异步方法不能和调用者在同一个class中

pom配置

requrest共享

通过TransmittableThreadLocal对象进行线程对象共享

注:系统中所有Request获取需要统一从CommonUtil指定来源,例如token鉴权等

自定义request过滤器

通过自定义过滤器对Request的内容进行备份保存,主线程结束时Request清除结束不会影响到子线程的相应参数的获取,也适用于增加拦截器/过滤器后body参数无法重复获取的问题。需要注意的是对header参数处理时key要忽略大小写

自定义任务执行器

用于拦截异步任务执行,在任务执前统一进行Request共享操作,且可以定义多个,不影响原有的异步任务代码

调用示例

给@Anysc注解指定进行共享拦截的任务执行器即可

到此这篇关于SpringBoot详细讲解异步任务如何获取HttpServletRequest的文章就介绍到这了,更多相关SpringBoot获取HttpServletRequest内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章