在异步任务中维护请求范围
在 Web 应用程序中,收到请求后执行异步任务是很常见的。然而,确保这些任务能够访问特定于请求的对象,例如那些用 @Scope(value = WebApplicationContext.SCOPE_REQUEST) 注解的对象,可能具有挑战性。
以非阻塞方式处理请求时,默认 SimpleAsyncTaskExecutor 无权访问请求线程的作用域,从而导致诸如“作用域‘请求’对于当前线程无效”之类的异常。
要解决此问题,可以创建自定义 ContextAwarePoolExecutor。该执行器将请求上下文信息与任务一起存储,并利用 ContextAwareCallable 设置和清除后台线程所需的上下文。
自定义执行器实现:
<code class="java">public class ContextAwarePoolExecutor extends ThreadPoolTaskExecutor { @Override public <T> Future<T> submit(Callable<T> task) { return super.submit(new ContextAwareCallable(task, RequestContextHolder.currentRequestAttributes())); } }</code>
上下文感知可调用:
<code class="java">public class ContextAwareCallable<T> implements Callable<T> { private Callable<T> task; private RequestAttributes context; public ContextAwareCallable(Callable<T> task, RequestAttributes context) { this.task = task; this.context = context; } @Override public T call() throws Exception { if (context != null) { RequestContextHolder.setRequestAttributes(context); } try { return task.call(); } finally { RequestContextHolder.resetRequestAttributes(); } } }</code>
配置覆盖:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
通过使用此自定义执行器,异步任务可以无缝访问请求 -作用域对象,克服了默认 SimpleAsyncTaskExecutor 的限制。
以上是如何维护异步任务中的请求范围?的详细内容。更多信息请关注PHP中文网其他相关文章!