在 Web 应用程序中,请求通常在 DispatcherServlet 或 DispatcherPortlet 的范围内处理。但是,当任务异步执行时(例如使用 AsyncTaskExecutor),请求范围将变得不可用。当尝试在异步任务中访问请求范围的 beans 时,这可能会导致异常。
问题:
要解决此问题,您需要找到一种方法来启用异步任务执行器内的请求范围。
解决方案:
一种方法涉及创建一个自定义执行器,用于存储请求范围信息和任务。具体操作方法如下:
创建自定义任务池执行器:
<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> { // ... @Override public T call() throws Exception { // Set the request context for the background thread // ... try { return task.call(); } finally { // Reset the request context // ... } } }</code>
覆盖执行器配置:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
通过使用此自定义执行器,您可以提交有权访问请求范围信息的任务。这使您能够在异步任务中使用请求范围的 bean,而不会遇到范围相关的异常。
注意:
此方法仅适用于会话和请求范围的 bean 。对于安全上下文(例如 Spring Security),您可能需要实现不同的方法来在后台线程中设置上下文。
以上是如何在 Spring 的异步任务中访问请求范围的 Bean?的详细内容。更多信息请关注PHP中文网其他相关文章!