Heim > Java > javaLernprogramm > Hauptteil

Wie aktiviere ich den Anforderungsbereich bei der asynchronen Aufgabenausführung?

DDD
Freigeben: 2024-10-31 02:31:02
Original
481 Leute haben es durchsucht

How to Enable Request Scope in Asynchronous Task Execution?

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

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

Konfigurationsüberschreibung:

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

Verwendung:

<code class="java">taskExecutor.execute(new ContextAwareCallable(new Runnable() {
    @Override
    public void run() {
        asyncRequest(request);
    }
}), RequestContextHolder.currentRequestAttributes());</code>
Nach dem Login kopieren

Hinweise:

  • Diese Methode unterstützt nur Anforderungs- und Sitzungsbereiche, keine Sicherheitskontexte.
  • Sie ist kompatibel mit Sowohl Callable- als auch Runnable-Schnittstellen.

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!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!