Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Mengakses Kacang Skop Permintaan dalam Tugas Asynchronous pada Musim Bunga?

Bagaimanakah Saya Boleh Mengakses Kacang Skop Permintaan dalam Tugas Asynchronous pada Musim Bunga?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 04:25:02988semak imbas

 How Can I Access Request-Scoped Beans in Asynchronous Tasks in Spring?

Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous

Dalam aplikasi web, permintaan biasanya diproses dalam skop DispatcherServlet atau DispatcherPortlet. Walau bagaimanapun, apabila tugasan dilaksanakan secara tak segerak, seperti menggunakan AsyncTaskExecutor, skop permintaan menjadi tidak tersedia. Ini boleh membawa kepada pengecualian apabila cuba mengakses kacang berskop permintaan dalam tugas async.

Masalah:

Untuk menyelesaikan isu ini, anda perlu mencari cara untuk mendayakan skop permintaan dalam pelaksana tugas tak segerak.

Penyelesaian:

Satu pendekatan melibatkan penciptaan pelaksana tersuai yang menyimpan maklumat skop permintaan dengan tugasan. Begini cara anda boleh melakukannya:

  1. Buat Pelaksana Kumpulan Tugas 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>
  2. Cipta Boleh Panggil Konteks Sedar:

    <code class="java">public class ContextAwareCallable<T> implements Callable<T> {
        // ...
        @Override
        public T call() throws Exception {
            // Set the request context for the background thread
            // ...
            try {
                return task.call();
            } finally {
                // Reset the request context
                // ...
            }
        }
    }</code>
  3. Timpa Konfigurasi Pelaksana:

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

Dengan menggunakan pelaksana tersuai ini, anda boleh menyerahkan tugasan yang mempunyai akses kepada maklumat skop permintaan. Ini membolehkan anda menggunakan kacang skop permintaan dalam tugas tak segerak anda tanpa menghadapi pengecualian berkaitan skop.

Nota:

Pendekatan ini hanya terpakai pada kacang skop Sesi dan Permintaan . Untuk konteks keselamatan (cth., Spring Security), anda mungkin perlu melaksanakan kaedah berbeza untuk menetapkan konteks dalam urutan latar belakang.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Kacang Skop Permintaan dalam Tugas Asynchronous pada Musim Bunga?. 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