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

Bagaimana untuk Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous?

DDD
Lepaskan: 2024-10-31 02:31:02
asal
577 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan