我在SpringBoot中公开了一个服务,我在RequestContextHolder中存储了一些属性。在我的一个API中,我必须异步执行一些活动。应用程序接受请求并创建一个新线程来执行活动并立即返回响应。我也将RequestContextHolder对象传递给线程。线程尝试从RequestContextHolder获取属性,并且在发送响应后它看起来像是null。如果我在线程完成执行后返回响应,则该值在线程中可用。我假设RequestContextHolder绑定到HTTPRequest,并在返回响应时丢失。我的假设是否正确?如果是这样,我该如何处理这种情况?
org.springframework.web.context.request.RequestContextHolder
答案 0 :(得分:1)
在Spring Boot Application中,RequestContextFilter将请求设置为RequestContextHolder,并将其作为线程局部变量存储,并在控制器返回后清除它。使用RequestContextHolder作为另一个线程的参数是不正确的,因为它的内容可以在处理过程中改变。
在通过RequestContextHolder.getRequestAttributes()开始新的并发任务之前使用实际请求,其中包含所有属性集,并且只是一个没有ThreadLocal的普通对象。