In einer Anwendung, die asynchrone Webdienste nutzt, wo der Server mit einer Bestätigung antwortet, während er die asynchrone Verarbeitung über einen AsyncTaskExecutor beginnt, wird dies der Fall entscheidend, um den Anforderungsbereich zu aktivieren. Dies ist wichtig für den Zugriff auf Bean-Klassen, die mit @Scope(WebApplicationContext.SCOPE_REQUEST) annotiert sind.
Typischerweise tritt in solchen Szenarien eine Ausnahme auf, weil der Anforderungsbereich im SimpleAsyncTaskExecutor, der außerhalb des DispatcherServlet ausgeführt wird, nicht aktiv ist . Um dieses Problem zu beheben, ziehen Sie die folgende Lösung in Betracht:
Hinweis: Dieser Ansatz unterstützt nur Sitzungs- und Anforderungsbereichs-Beans, keinen Sicherheitskontext (z. B. Spring Security). . Für die Handhabung des Sicherheitskontexts sollten separate Maßnahmen implementiert werden.
Beispielimplementierung:
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>
Aufrufbar:
<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>
Konfiguration:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
Das obige ist der detaillierte Inhalt vonWie kann der Anforderungsbereich bei der asynchronen Aufgabenausführung beibehalten werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!