Heim >Java >javaLernprogramm >Wie kann ich im Frühjahr in asynchronen Aufgaben auf Beans mit Anforderungsbereich zugreifen?

Wie kann ich im Frühjahr in asynchronen Aufgaben auf Beans mit Anforderungsbereich zugreifen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-03 04:25:02988Durchsuche

 How Can I Access Request-Scoped Beans in Asynchronous Tasks in Spring?

Anforderungsbereich bei asynchroner Aufgabenausführung aktivieren

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:

  1. 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>
  2. 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>
  3. Ü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!

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