Rumah > Java > javaTutorial > teks badan

Bagaimana untuk mengakses kacang berskop permintaan dalam pelaksanaan tugas tak segerak?

Mary-Kate Olsen
Lepaskan: 2024-10-31 01:54:01
asal
801 orang telah melayarinya

How to access request-scoped beans within asynchronous task execution?

Cara Mengekalkan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous

Dalam aplikasi web, adalah perkara biasa untuk melakukan operasi tak segerak yang memerlukan penggunaan kacang dengan skop permintaan. Mendayakan skop permintaan dalam pelaksanaan tugas tak segerak boleh dicapai dengan melaksanakan pelaksana tugas tersuai.

Masalah:

Anda mempunyai perkhidmatan web tak segerak yang memulakan pemprosesan dalam AsyncTaskExecutor. Walau bagaimanapun, anda perlu mengakses kelas beranotasi dengan @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) dalam pemprosesan ini. Walau bagaimanapun, anda menerima pengecualian kerana skop permintaan tidak aktif dalam SimpleAsyncTaskExecutor.

Penyelesaian:

Untuk mendayakan skop permintaan dalam pelaksanaan tugas tak segerak, kami akan melaksanakan langkah berikut:

  1. Buat Pelaksana 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>
    Salin selepas log masuk
  2. Melaksanakan Konteks-Sedar Boleh Panggil:

    <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
  3. Konfigurasikan Pelaksana Tugas Tersuai:

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

Penjelasan :

ContextAwarePoolExecutor memintas tugasan yang diserahkan dan membungkusnya dalam kejadian ContextAwareCallable. Pemanggil ini menetapkan konteks permintaan semasa sebelum melaksanakan tugas sebenar dan menetapkannya semula selepas itu. Ini memastikan bahawa kacang berskop permintaan boleh diakses semasa pelaksanaan tak segerak.

Nota:

  • Penyelesaian ini berfungsi untuk skop sesi dan skop permintaan beans tetapi bukan untuk konteks keselamatan.
  • Pelaksanaan boleh jalan boleh dibuat dan digunakan sebagai ganti pelaksanaan boleh panggil untuk kaedah execute().

Atas ialah kandungan terperinci Bagaimana untuk mengakses kacang berskop permintaan dalam pelaksanaan tugas tak segerak?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!