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:
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>
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>
Konfigurasikan Pelaksana Tugas Tersuai:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
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:
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!