【发布时间】:2019-01-29 03:23:51
【问题描述】:
我们将@Async 用于多线程。直到每个多线程方法我都可以看到 RequestContextHolder.getRequestAttributes() 的值。
但是当我在方法内部进行调试时,我将请求属性设置为 NULL。
有什么想法吗?
【问题讨论】:
-
请提供一些代码。
标签: java spring multithreading asynchronous
我们将@Async 用于多线程。直到每个多线程方法我都可以看到 RequestContextHolder.getRequestAttributes() 的值。
但是当我在方法内部进行调试时,我将请求属性设置为 NULL。
有什么想法吗?
【问题讨论】:
标签: java spring multithreading asynchronous
为了解决这个问题,我们创建了一个 ContextAwareRunnable 对象,该对象预先填充了当前的 requestHolder、securityContextHolder 等,以便所有生成的线程都能够像在主线程中运行一样执行。
【讨论】:
executor.submit(() -> YourClass.methodName(), contextAwareExecutor);
默认情况下,ThreadLocal 变量用作请求属性的持有者。这意味着只有处理整个 https 请求的单个线程才能访问请求属性。相比之下,@Async 方法由来自单独线程池的线程处理,因此它们无法访问属性。
但是,还有一个InheritableThreadLocal 变量可以用作请求属性持有者,而不是默认变量。您可以通过在DispatcherServlet 或RequestContextFilter 中将threadContextInheritable 属性设置为true 来启用它。
查看RequestContextHolder 的实现以了解更多详细信息。
【讨论】: