Anforderungsbereich bei asynchroner Aufgabenausführung aktivieren
Problem:
Asynchrone Webdienste müssen Greifen Sie innerhalb ihrer asynchronen Verarbeitung auf Beans mit Anforderungsbereich zu, insbesondere auf solche, die mit @Scope(value = WebApplicationContext.SCOPE_REQUEST) annotiert sind. SimpleAsyncTaskExecutor behält jedoch keine Thread-gebundenen Anforderungsattribute bei, was zu Ausnahmen führt.
Lösung:
Um den Anforderungsbereich bei der asynchronen Aufgabenausführung zu aktivieren, wird ein benutzerdefinierter TaskPoolExecutor erstellt zusammen mit einem speziellen Callable, das den Anforderungskontext für den Hintergrundthread speichert und löscht.
Implementierung:
Benutzerdefinierter Executor:
<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>
Kontextbewusst aufrufbar:
<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>
Konfigurationsüberschreibung:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
Verwendung:
<code class="java">taskExecutor.execute(new ContextAwareCallable(new Runnable() { @Override public void run() { asyncRequest(request); } }), RequestContextHolder.currentRequestAttributes());</code>
Hinweise:
Das obige ist der detaillierte Inhalt vonWie aktiviere ich den Anforderungsbereich bei der asynchronen Aufgabenausführung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!