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