Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous
Masalah:
Perkhidmatan web tak segerak perlu akses kacang berskop permintaan dalam pemprosesan tak segeraknya, terutamanya yang diberi penjelasan dengan @Scope(value = WebApplicationContext.SCOPE_REQUEST). Walau bagaimanapun, SimpleAsyncTaskExecutor tidak mengekalkan atribut permintaan terikat benang, yang membawa kepada pengecualian.
Penyelesaian:
Untuk mendayakan skop permintaan dalam pelaksanaan tugas tak segerak, TaskPoolExecutor tersuai dicipta bersama-sama dengan Boleh Panggil khas yang menyimpan dan mengosongkan konteks permintaan untuk urutan latar belakang.
Pelaksanaan:
Pelaksana 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>
Nota:
<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>
Kaedah ini hanya menyokong permintaan dan skop sesi, bukan konteks keselamatan.
Ia serasi dengan kedua-dua antara muka Boleh Dipanggil dan Boleh Dijalankan.<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
Atas ialah kandungan terperinci Bagaimana untuk Mendayakan Skop Permintaan dalam Pelaksanaan Tugas Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!