Heim  >  Artikel  >  Java  >  Wie aktiviere ich den Anforderungsbereich bei der asynchronen Aufgabenausführung?

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

DDD
DDDOriginal
2024-10-31 02:31:02467Durchsuche

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>

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:

  • 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!

Stellungnahme:
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