首頁  >  文章  >  Java  >  如何在非同步任務執行中啟用請求範圍?

如何在非同步任務執行中啟用請求範圍?

DDD
DDD原創
2024-10-31 02:31:02554瀏覽

How to Enable Request Scope in Asynchronous Task Execution?

在非同步任務執行中啟用請求範圍

問題:

解決方案:

為了在非同步任務執行中啟用請求作用域,創建了一個自定義的TaskPoolExecutor以及一個特殊的Callable,用於存儲和清除後台線程的請求上下文。

實作:

自訂執行器:

<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>
用法:

<code class="java">taskExecutor.execute(new ContextAwareCallable(new Runnable() {
    @Override
    public void run() {
        asyncRequest(request);
    }
}), RequestContextHolder.currentRequestAttributes());</code>
注意:

此方法僅支援請求和會話範圍,不支援安全上下文。
  • 它相容於Callable 和 Runnable 介面。

以上是如何在非同步任務執行中啟用請求範圍?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn