Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous?

Bagaimana untuk Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous?

DDD
DDDasal
2024-10-31 02:31:02553semak imbas

How to Enable Request Scope in Asynchronous Task Execution?

Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous

Masalah:

Perkhidmatan web tak segerak perlu akses kacang berskop permintaan dalam pemprosesan tak segeraknya, terutamanya yang diberi penjelasan dengan @Scope(value = WebApplicationContext.SCOPE_REQUEST). Walau bagaimanapun, SimpleAsyncTaskExecutor tidak mengekalkan atribut permintaan terikat benang, yang membawa kepada pengecualian.

Penyelesaian:

Untuk mendayakan skop permintaan dalam pelaksanaan tugas tak segerak, TaskPoolExecutor tersuai dicipta bersama-sama dengan Boleh Panggil khas yang menyimpan dan mengosongkan konteks permintaan untuk urutan latar belakang.

Pelaksanaan:

Pelaksana Tersuai:

<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>

Nota:

<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>

Kaedah ini hanya menyokong permintaan dan skop sesi, bukan konteks keselamatan.

Ia serasi dengan kedua-dua antara muka Boleh Dipanggil dan Boleh Dijalankan.
<code class="java">@Configuration
public class ExecutorConfig extends AsyncConfigurerSupport {
    @Override
    @Bean
    public Executor getAsyncExecutor() {
        return new ContextAwarePoolExecutor();
    }
}</code>

Atas ialah kandungan terperinci Bagaimana untuk Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn