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