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

Bagaimana untuk Mengekalkan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous?

DDD
DDDasal
2024-10-31 21:59:02769semak imbas

How to Preserve Request Scope in Asynchronous Task Execution?

Memelihara Skop Permintaan dalam Pelaksanaan Tugas Asynchronous

Dalam aplikasi yang menggunakan perkhidmatan web tak segerak, di mana pelayan bertindak balas dengan pengakuan semasa memulakan pemprosesan tak segerak melalui Async itskExecutor. penting untuk membolehkan skop permintaan. Ini penting untuk mengakses kelas kacang yang diberi penjelasan dengan @Scope(WebApplicationContext.SCOPE_REQUEST).

Biasanya, dalam senario sedemikian, pengecualian berlaku disebabkan skop permintaan tidak aktif dalam SimpleAsyncTaskExecutor, yang beroperasi di luar DispatcherServlet . Untuk menyelesaikan isu ini, pertimbangkan penyelesaian berikut:

  1. Buat Pelaksana Tugasan Tersuai: Tentukan pelaksana tersuai yang memanjangkan ThreadPoolTaskExecutor Spring dan memintas pelaksanaan tugas yang diserahkan.
  2. Encapsulate Request Context: Buat Callable (atau Runnable) khusus yang menggunakan maklumat konteks permintaan untuk menetapkan dan mengosongkan konteks pada urutan latar belakang.
  3. Override Execution Configuration: Gantikan konfigurasi pelaksana lalai untuk menggunakan pelaksana tersuai.

Nota: Pendekatan ini hanya menyokong kacang skop Sesi dan Permintaan, bukan konteks keselamatan (cth., Spring Security) . Untuk pengendalian konteks keselamatan, langkah berasingan harus dilaksanakan.

Contoh Pelaksanaan:

Pelaksana:

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

Boleh Dipanggil:

<code class="java">public class ContextAwareCallable<T> implements Callable<T> {
    private Callable<T> task;
    private RequestAttributes context;
    @Override
    public T call() throws Exception {
        if (context != null) {
            RequestContextHolder.setRequestAttributes(context);
        }
        try {
            return task.call();
        } finally {
            RequestContextHolder.resetRequestAttributes();
        }
    }
}</code>

Konfigurasi:

<code class="java">@Configuration
public class ExecutorConfig extends AsyncConfigurerSupport {
    @Override
    @Bean
    public Executor getAsyncExecutor() {
        return new ContextAwarePoolExecutor();
    }
}</code>

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan 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