在使用异步 Web 服务的应用程序中,服务器在通过 AsyncTaskExecutor 开始异步处理时响应确认,它变成对于启用请求范围至关重要。这对于访问使用 @Scope(WebApplicationContext.SCOPE_REQUEST) 注解的 bean 类至关重要。
通常,在这种情况下,由于请求作用域在 DispatcherServlet 外部运行的 SimpleAsyncTaskExecutor 内未处于活动状态,因此会发生异常。要解决此问题,请考虑以下解决方案:
注意:此方法仅支持 Session 和 Request 范围的 beans,而不支持安全上下文(例如,Spring Security)。对于安全上下文处理,应实施单独的措施。
示例实现:
执行器:
<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; @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>
以上是如何在异步任务执行中保留请求范围?的详细内容。更多信息请关注PHP中文网其他相关文章!