Heim > Java > javaLernprogramm > Wie kann der Anforderungsbereich bei der asynchronen Aufgabenausführung beibehalten werden?

Wie kann der Anforderungsbereich bei der asynchronen Aufgabenausführung beibehalten werden?

DDD
Freigeben: 2024-10-31 21:59:02
Original
929 Leute haben es durchsucht

How to Preserve Request Scope in Asynchronous Task Execution?

Beibehalten des Anforderungsbereichs bei der asynchronen Aufgabenausführung

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:

  1. Erstellen Sie einen benutzerdefinierten Task-Executor: Definieren Sie einen benutzerdefinierten Executor, der Springs ThreadPoolTaskExecutor erweitert und die Ausführung übermittelter Aufgaben abfängt.
  2. Anforderungskontext kapseln:Erstellen Sie ein spezielles Callable (oder Runnable), das die Anforderungskontextinformationen verwendet, um den Kontext im Hintergrundthread festzulegen und zu löschen.
  3. Ausführungskonfiguration überschreiben: Überschreiben Sie die Standard-Executor-Konfiguration, um den benutzerdefinierten Executor zu verwenden.

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Konfiguration:

<code class="java">@Configuration
public class ExecutorConfig extends AsyncConfigurerSupport {
    @Override
    @Bean
    public Executor getAsyncExecutor() {
        return new ContextAwarePoolExecutor();
    }
}</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage