Heim Java javaLernprogramm Ausführliche Erläuterung der Verwendung von @Async im Frühjahr und einfache Beispieleinführung

Ausführliche Erläuterung der Verwendung von @Async im Frühjahr und einfache Beispieleinführung

Mar 07, 2017 am 10:12 AM

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung und einfache Beispiele der @Async-Nutzung im Frühling vor. Freunde, die es benötigen, können sich auf

@Async-Nutzung im Frühling

beziehen Einführung: In Java-Anwendungen wird die Interaktionsverarbeitung in den meisten Fällen durch Synchronisierung erreicht. Bei der Interaktion mit Systemen von Drittanbietern kann es jedoch leicht zu langsamen Reaktionen kommen. In der Vergangenheit wurden hierfür meist mehrere Threads verwendet Tatsächlich wurde nach Spring 3.x @Async integriert, um dieses Problem perfekt zu lösen. In diesem Artikel wird die Verwendung von @Async vollständig vorgestellt.

1. Was ist ein asynchroner Aufruf?

Bevor wir asynchrone Aufrufe erklären, werfen wir zunächst einen Blick auf die Definition synchroner Aufrufe. Synchronisierung bedeutet, dass der gesamte Verarbeitungsprozess nacheinander ausgeführt wird und nach Abschluss jedes Prozesses die Ergebnisse zurückgegeben werden. Beim asynchronen Aufruf werden nur die aufrufenden Anweisungen gesendet, und der Aufrufer muss nicht darauf warten, dass die aufgerufene Methode vollständig ausgeführt wird, sondern führt stattdessen den folgenden Prozess weiter aus.

Beispielsweise müssen in einem bestimmten Aufruf die drei Prozessmethoden A, B und C nacheinander aufgerufen werden. Wenn es sich um synchrone Aufrufe handelt, müssen sie nacheinander ausgeführt werden, bevor die Prozessausführung abgeschlossen ist. Wenn B eine asynchrone Aufrufmethode ist, wartet der Aufruf von B nach der Ausführung von A nicht auf den Abschluss von B, sondern beginnt mit der Ausführung und ruft C auf. Nachdem C ausgeführt wurde, bedeutet dies, dass der Prozess abgeschlossen ist.

2. Herkömmliche asynchrone Aufrufverarbeitungsmethoden

In Java basieren sie bei der Bearbeitung ähnlicher Szenarien normalerweise auf der Erstellung unabhängiger Threads, um die entsprechenden asynchronen Aufruflogikdurchläufe abzuschließen Der Ausführungsprozess zwischen dem Hauptthread und verschiedenen Threads, sodass der Hauptthread nach dem Starten eines unabhängigen Threads ohne Anhalten und Warten weiter ausgeführt wird.

3. Einführung in @Async

In Spring werden Methoden, die auf der @Async-Annotation basieren, als asynchrone Methoden bezeichnet Der Aufrufer muss nicht auf den Abschluss eines Threads warten, bevor er mit anderen Vorgängen fortfahren kann.

So aktivieren Sie @Async in Spring

Aktivierung basierend auf der Java-Konfiguration:

@Configuration 
@EnableAsync 
public class SpringAsyncConfig { ... }
Nach dem Login kopieren

Basierend auf der XML-Konfiguration Die Dateiaktivierungsmethode ist wie folgt konfiguriert:

<task:executor id="myexecutor" pool-size="5" /> 
<task:annotation-driven executor="myexecutor"/>
Nach dem Login kopieren

Die oben genannten sind die beiden Definitionsmethoden.

4. Aufruf von

basierend auf @Async ohne Rückgabewert. Das Beispiel lautet wie folgt:

@Async //标注使用 
public void asyncMethodWithVoidReturnType() { 
  System.out.println("Execute method asynchronously. " 
   + Thread.currentThread().getName()); 
}
Nach dem Login kopieren

verwendet Die Methode ist sehr einfach, ein Etikett kann alle Probleme lösen.

5. Aufruf basierend auf dem @Async-Rückgabewert

Beispiele sind wie folgt:

@Async 
public Future<String> asyncMethodWithReturnType() { 
  System.out.println("Execute method asynchronously - " 
   + Thread.currentThread().getName()); 
  try { 
    Thread.sleep(5000); 
    return new AsyncResult<String>("hello world !!!!"); 
  } catch (InterruptedException e) { 
    // 
  } 
  
  return null; 
}
Nach dem Login kopieren

Aus dem obigen Beispiel können Sie ersehen, dass der zurückgegebene Datentyp der Typ Future ist, bei dem es sich um eine Schnittstelle handelt. Der spezifische Ergebnistyp ist AsyncResult, worauf Sie achten sollten.

Beispiel für den Aufruf einer asynchronen Methode, die ein Ergebnis zurückgibt:

public void testAsyncAnnotationForMethodsWithReturnType() 
  throws InterruptedException, ExecutionException { 
  System.out.println("Invoking an asynchronous method. " 
   + Thread.currentThread().getName()); 
  Future<String> future = asyncAnnotationExample.asyncMethodWithReturnType(); 
  
  while (true) { ///这里使用了循环判断,等待获取结果信息 
    if (future.isDone()) { //判断是否执行完毕 
      System.out.println("Result from asynchronous process - " + future.get()); 
      break; 
    } 
    System.out.println("Continue doing something else. "); 
    Thread.sleep(1000); 
  } 
}
Nach dem Login kopieren

Analyse: Diese erhalten die Ergebnisinformationen der asynchrone Methode durch Dies wird erreicht, indem der Status von Future ständig überprüft wird, um festzustellen, ob die aktuelle asynchrone Methode ausgeführt wurde.

6. Ausnahmebehandlungsmechanismus basierend auf @Async-Aufrufen

Wenn bei einer asynchronen Methode eine Ausnahme auftritt, ist es für den Aufrufer unmöglich, sie wahrzunehmen. Wenn tatsächlich eine Ausnahmebehandlung erforderlich ist, gehen Sie wie folgt vor:

1. Passen Sie den Task-Executor an, der AsyncTaskExecutor implementiert.

Definieren Sie hier die Logik und Methode zur Behandlung bestimmter Ausnahmen.

2. Konfigurieren Sie einen benutzerdefinierten TaskExecutor, um den integrierten Task-Executor zu ersetzen.

Beispielschritt 1, benutzerdefinierter TaskExecutor

public class ExceptionHandlingAsyncTaskExecutor implements AsyncTaskExecutor { 
  private AsyncTaskExecutor executor; 
  public ExceptionHandlingAsyncTaskExecutor(AsyncTaskExecutor executor) { 
    this.executor = executor; 
   } 
   ////用独立的线程来包装,@Async其本质就是如此 
  public void execute(Runnable task) {    
   executor.execute(createWrappedRunnable(task)); 
  } 
  public void execute(Runnable task, long startTimeout) { 
    /用独立的线程来包装,@Async其本质就是如此 
    executor.execute(createWrappedRunnable(task), startTimeout);      
  }  
  public Future submit(Runnable task) { return executor.submit(createWrappedRunnable(task)); 
    //用独立的线程来包装,@Async其本质就是如此。 
  }  
  public Future submit(final Callable task) { 
   //用独立的线程来包装,@Async其本质就是如此。 
    return executor.submit(createCallable(task));  
  }  
   
  private Callable createCallable(final Callable task) {  
    return new Callable() {  
      public T call() throws Exception {  
         try {  
           return task.call();  
         } catch (Exception ex) {  
           handle(ex);  
           throw ex;  
          }  
         }  
    };  
  } 
 
  private Runnable createWrappedRunnable(final Runnable task) {  
     return new Runnable() {  
       public void run() {  
         try { 
           task.run();  
         } catch (Exception ex) {  
           handle(ex);  
          }  
      } 
    };  
  }  
  private void handle(Exception ex) { 
   //具体的异常逻辑处理的地方 
   System.err.println("Error during @Async execution: " + ex); 
  } 
}
Nach dem Login kopieren

Analyse: Es kann festgestellt werden, dass es AsyncTaskExecutor implementiert und unabhängige Threads verwendet, um bestimmte Methodenoperationen auszuführen. In createCallable und createWrapperRunnable werden die Methode und der Mechanismus zur Ausnahmebehandlung definiert.

handle() ist der Punkt, an dem wir uns in Zukunft auf die Ausnahmebehandlung konzentrieren müssen.

Inhalt in der Konfigurationsdatei:

<task:annotation-driven executor="exceptionHandlingTaskExecutor" scheduler="defaultTaskScheduler" /> 
<bean id="exceptionHandlingTaskExecutor" class="nl.jborsje.blog.examples.ExceptionHandlingAsyncTaskExecutor"> 
  <constructor-arg ref="defaultTaskExecutor" /> 
</bean> 
<task:executor id="defaultTaskExecutor" pool-size="5" /> 
<task:scheduler id="defaultTaskScheduler" pool-size="1" />
Nach dem Login kopieren

Analyse: Die Konfiguration hier verwendet einen benutzerdefinierten TaskExecutor, um den Standard-TaskExecutor zu ersetzen.

7. Transaktionsverarbeitungsmechanismus in @Async-Aufrufen

Mit @Async gekennzeichnete Methoden werden in ihnen auch mit @Transactional gekennzeichnet; , ist die Transaktionsverwaltungssteuerung nicht verfügbar, da es sich um einen Vorgang handelt, der auf asynchroner Verarbeitung basiert.

Wie kann man diesen Vorgängen also das Transaktionsmanagement hinzufügen? Methoden, die Transaktionsverwaltungsvorgänge erfordern, können in die asynchrone Methode eingefügt werden, und @Transactional.

wird zur intern aufgerufenen Methode hinzugefügt. Beispiel: Methode A ist mit @Async/@Transactional gekennzeichnet, eine Transaktion jedoch nicht zu Kontrollzwecken generiert werden.

Methode B wird mit @Async annotiert. C und D werden in B aufgerufen. C/D werden jeweils mit @Transactional annotiert, was den Zweck der Transaktionssteuerung erreichen kann.

8. Zusammenfassung

Durch die obige Beschreibung sollten wir die Methoden und Vorsichtsmaßnahmen für die Verwendung von @Async kennen.

Das Obige ist eine ausführliche Erklärung und einfache Beispiele für die Verwendung von @Async im Frühjahr. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Ein neues Programmierparadigma, wenn Spring Boot auf OpenAI trifft Ein neues Programmierparadigma, wenn Spring Boot auf OpenAI trifft Feb 01, 2024 pm 09:18 PM

Im Jahr 2023 ist die KI-Technologie zu einem heißen Thema geworden und hat enorme Auswirkungen auf verschiedene Branchen, insbesondere im Programmierbereich. Die Bedeutung der KI-Technologie wird den Menschen zunehmend bewusst, und die Spring-Community bildet da keine Ausnahme. Mit der kontinuierlichen Weiterentwicklung der GenAI-Technologie (General Artificial Intelligence) ist es entscheidend und dringend geworden, die Erstellung von Anwendungen mit KI-Funktionen zu vereinfachen. Vor diesem Hintergrund entstand „SpringAI“ mit dem Ziel, den Prozess der Entwicklung von KI-Funktionsanwendungen zu vereinfachen, ihn einfach und intuitiv zu gestalten und unnötige Komplexität zu vermeiden. Durch „SpringAI“ können Entwickler einfacher Anwendungen mit KI-Funktionen erstellen, wodurch diese einfacher zu verwenden und zu bedienen sind.

Verwenden Sie Spring Boot und Spring AI, um generative Anwendungen für künstliche Intelligenz zu erstellen Verwenden Sie Spring Boot und Spring AI, um generative Anwendungen für künstliche Intelligenz zu erstellen Apr 28, 2024 am 11:46 AM

Als Branchenführer bietet Spring+AI durch seine leistungsstarke, flexible API und erweiterte Funktionen führende Lösungen für verschiedene Branchen. In diesem Thema werden wir uns mit den Anwendungsbeispielen von Spring+AI in verschiedenen Bereichen befassen. Jeder Fall wird zeigen, wie Spring+AI spezifische Anforderungen erfüllt, Ziele erreicht und diese LESSONSLEARNED auf ein breiteres Anwendungsspektrum ausdehnt. Ich hoffe, dieses Thema kann Sie dazu inspirieren, die unendlichen Möglichkeiten von Spring+AI tiefer zu verstehen und zu nutzen. Das Spring-Framework hat eine mehr als 20-jährige Geschichte im Bereich der Softwareentwicklung, und seit der Veröffentlichung der Spring Boot 1.0-Version sind 10 Jahre vergangen. Nun kann niemand diesen Frühling bestreiten

Was sind die Implementierungsmethoden für programmatische Frühlingstransaktionen? Was sind die Implementierungsmethoden für programmatische Frühlingstransaktionen? Jan 08, 2024 am 10:23 AM

So implementieren Sie programmgesteuerte Spring-Transaktionen: 1. Verwenden Sie TransactionCallback und TransactionCallbackWithoutResult; 4. Verwenden Sie TransactionTemplate in Kombination mit @Transactional;

So implementieren Sie geplante Aufgaben in Java Spring So implementieren Sie geplante Aufgaben in Java Spring May 24, 2023 pm 01:28 PM

Java implementiert geplante Aufgaben In der mit Jdk gelieferten Bibliothek gibt es zwei Möglichkeiten, geplante Aufgaben zu implementieren: eine ist Timer und die andere ist ScheduledThreadPoolExecutor. Wenn Timer+TimerTask einen Timer erstellt, wird ein Thread erstellt, der zum Planen von TimerTask-Aufgaben verwendet werden kann. Der Timer verfügt über vier Konstruktionsmethoden. Sie können den Namen des Timer-Threads angeben und angeben, ob er als Daemon-Thread festgelegt werden soll. Der Standardname ist Timer-Nummer und der Standardname ist kein Daemon-Thread. Es gibt drei Hauptmethoden: cancel(): Aufgabenplanung beenden, alle derzeit geplanten Aufgaben abbrechen, laufende Aufgaben sind davon nicht betroffen. purge(): Aufgaben aus der Aufgabenwarteschlange entfernen

Die Unterschiede und Zusammenhänge zwischen Spring Boot und Spring Cloud Die Unterschiede und Zusammenhänge zwischen Spring Boot und Spring Cloud Jun 22, 2023 pm 06:25 PM

SpringBoot und SpringCloud sind beides Erweiterungen des Spring Framework, die Entwicklern dabei helfen, Microservice-Anwendungen schneller zu erstellen und bereitzustellen. Sie haben jedoch jeweils unterschiedliche Zwecke und Funktionen. SpringBoot ist ein Framework zum schnellen Erstellen von Java-Anwendungen, das es Entwicklern ermöglicht, Spring-basierte Anwendungen schneller zu erstellen und bereitzustellen. Es bietet eine einfache und leicht verständliche Möglichkeit, eigenständige, ausführbare Spring-Anwendungen zu erstellen

Die 7 am häufigsten verwendeten Anmerkungen in Spring, der mächtigsten Organisation der Geschichte! Die 7 am häufigsten verwendeten Anmerkungen in Spring, der mächtigsten Organisation der Geschichte! Jul 26, 2023 pm 04:38 PM

Mit der Aktualisierung und Iteration der Technologie begann Java5.0, Anmerkungen zu unterstützen. Als führendes Framework in Java hat Spring seit der Aktualisierung auf Version 2.5 langsam damit begonnen, die XML-Konfiguration aufzugeben, und es werden mehr Annotationen zur Steuerung des Spring-Frameworks verwendet.

So legen Sie die Transaktionsisolationsstufe im Frühjahr fest So legen Sie die Transaktionsisolationsstufe im Frühjahr fest Jan 26, 2024 pm 05:38 PM

So legen Sie die Transaktionsisolationsstufe in Spring fest: 1. Verwenden Sie die Annotation @Transactional. 3. Legen Sie sie in der Spring-Konfigurationsdatei fest. 4. Legen Sie sie in der Java-Konfigurationsklasse fest. Detaillierte Einführung: 1. Verwenden Sie die Annotation @Transactional, fügen Sie die Annotation @Transactional zu der Klasse oder Methode hinzu, die eine Transaktionsverwaltung erfordert, und legen Sie die Isolationsstufe im Attribut fest. 2. In der Spring-Konfigurationsdatei usw.

Lernen Sie Spring Cloud von Grund auf Lernen Sie Spring Cloud von Grund auf Jun 22, 2023 am 08:11 AM

Als Java-Entwickler ist das Erlernen und Verwenden des Spring-Frameworks eine wesentliche Fähigkeit. Mit der Popularität von Cloud Computing und Microservices ist das Erlernen und Verwenden von Spring Cloud zu einer weiteren Fähigkeit geworden, die beherrscht werden muss. SpringCloud ist ein auf SpringBoot basierendes Entwicklungstoolset zum schnellen Aufbau verteilter Systeme. Es bietet Entwicklern eine Reihe von Komponenten, darunter Dienstregistrierung und -erkennung, Konfigurationscenter, Lastausgleich und Leistungsschalter usw., sodass Entwickler Mikrofunktionen erstellen können

See all articles