首页 > Java > java教程 > 如何维护异步任务中的请求范围?

如何维护异步任务中的请求范围?

Barbara Streisand
发布: 2024-11-03 07:51:03
原创
1019 人浏览过

How Can I Maintain Request Scope in Asynchronous Tasks?

在异步任务中维护请求范围

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板