Heim >Java >javaLernprogramm >Wie kann ich im Frühjahr in asynchronen Aufgaben auf Beans mit Anforderungsbereich zugreifen?
In Webanwendungen werden Anforderungen normalerweise im Rahmen eines DispatcherServlet oder DispatcherPortlet verarbeitet. Wenn Aufgaben jedoch asynchron ausgeführt werden, beispielsweise mit einem AsyncTaskExecutor, ist der Anforderungsbereich nicht mehr verfügbar. Dies kann zu Ausnahmen führen, wenn versucht wird, in asynchronen Aufgaben auf Beans mit Anforderungsbereich zuzugreifen.
Problem:
Um dieses Problem zu beheben, müssen Sie eine Möglichkeit zur Aktivierung finden Der Anforderungsbereich innerhalb des asynchronen Task-Executors.
Lösung:
Ein Ansatz besteht darin, einen benutzerdefinierten Executor zu erstellen, der die Informationen zum Anforderungsbereich mit den Aufgaben speichert. So können Sie es tun:
Erstellen Sie einen benutzerdefinierten Task-Pool-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>
Erstellen Sie ein kontextsensitives Callable:
<code class="java">public class ContextAwareCallable<T> implements Callable<T> { // ... @Override public T call() throws Exception { // Set the request context for the background thread // ... try { return task.call(); } finally { // Reset the request context // ... } } }</code>
Überschreiben Sie die Executor-Konfiguration:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
Mit diesem benutzerdefinierten Executor können Sie Aufgaben senden, die Zugriff auf die Informationen zum Anforderungsbereich haben. Dadurch können Sie Beans mit Anforderungsbereich in Ihren asynchronen Aufgaben verwenden, ohne auf bereichsbezogene Ausnahmen zu stoßen.
Hinweis:
Dieser Ansatz gilt nur für Beans mit Sitzungs- und Anforderungsbereich . Für den Sicherheitskontext (z. B. Spring Security) müssen Sie möglicherweise eine andere Methode implementieren, um den Kontext im Hintergrundthread festzulegen.
Das obige ist der detaillierte Inhalt vonWie kann ich im Frühjahr in asynchronen Aufgaben auf Beans mit Anforderungsbereich zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!