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

Bagaimana untuk Mengekalkan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous?

DDD
Lepaskan: 2024-10-31 21:59:02
asal
916 orang telah melayarinya

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

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

Konfigurasi:

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