3

Ich habe eine Frage über Spring @ Async Annotation. Ich habe einen Controller einen Dienst (GnInsuranceDetailsService) autowiredSpring @ Async Annotation

@RequestMapping(value="/agn/AP0W01A_010/insertDetail.do") 
public ResponseEntity<?> insertDetail(@ModelAttribute("dto")GnInsuranceDetailsDTO dto,HttpSession session) throws Exception { 
    gnInsuranceDetailsDTO.setBkFlag(getAgnUserInfo(session).getBkFlag()); 
    gnInsuranceDetailsService.insertGnInsuranceDetail(dto);//open another thread to insert data 
    MessageDTO dto = new MessageDTO(AgnConstant.INSERT_SUCCESS); 
    return new ResponseEntity<MessageDTO>(dto,HttpStatus.OK);// increase return time for client 
    } 

und die Service insertGnInsuranceDetail Methode, die ich @Async up-Methode deklarieren.

@Transactional(readOnly = false) 
@Async 
public void insertGnInsuranceDetail(GnInsuranceDetailsDTO gnInsuranceDetailsDTO) throws Exception{ 
GnInsuranceDetails entity = gnInsuranceDetailsDTO.convert(); 
gnInsuranceDetailsDAO.save(detailsEntity); 
} 

habe ich die @Async für die Service-Methode Controller Antwortzeit für Client-Seite zu erhöhen, aber es funktioniert nicht, wie ich glaube. Verliere ich etwas? Oder Wie kann ich am einfachsten ändern?

Antwort

3

Sie würden nichts verlieren, wenn Sie @Async in den Methodendienst versetzen, wird in einem anderen Thread ausgeführt, Controllers insertDetail-Methode wird nicht zurückgegeben, bis Ihre insertGnInsuranceDetail zurückgegeben oder eine Ausnahme ausgelöst wird.

+0

Hellow, @ kuhajeyan.I den Test-Code Gewinde verwenden. schlaf (10000L) vor insertGnInsuranceDetail Methode begin.but nicht funktioniert.Controller wird warten> 10s für Service-EinsatzGnInsuranceDetail-Methode abgeschlossen. –

+0

@HamiltonLin sind Sie sicher, dass Sie @ EnableAsync in der Konfiguration für @ Async zu arbeiten – kuhajeyan

+0

So konfigurieren Sie diese Konfiguration im Frühjahr –

0

Ich habe die @ Async für die Service-Methode, um Controller-Reaktionszeit für Client-Seite zu erhöhen, aber es funktioniert nicht, wie ich denke.

@Async - Anmerkung, die eine Methode als Kandidaten für die asynchrone Ausführung kennzeichnet. Kann auch auf der Typebene verwendet werden. In diesem Fall werden alle Methoden des Typs als asynchron betrachtet.

Diese @ Async-Annotation hilft Ihnen nicht bei der Verzögerung der Antwortzeit. Um eine Verzögerung einführen, verwenden Thread.sleep(milliseconds);


Wenn Sie Haupt-Thread (Controller) soll für Gewindeeinsatz Daten warten, um ein Ergebnis zu erhalten (erfolgreich/Fehler) Sie können nur db Schicht Code von der Steuerung aufrufen. Wenn Sie möchten, dass die Clientantwort früher gesendet wird, erstellen Sie einen neuen Thread im Controller und verwenden diesen Thread zum Einfügen von Daten. Bei dem letztgenannten Ansatz zum Erstellen eines neuen Threads für Einfügedaten weiß Ihr Client nichts über den Status der Dateneinfügung, da der Thread in der Steuerung erstellt wird und in der Steuerung endet, kann keine Rückmeldung/Antwort an den Client gegeben werden , da wir keine Kundendetails haben werden.

Hoffe es hilft!

Referenz: https://www.tutorialspoint.com/java/lang/thread_sleep_millis.htm

+0

verwenden Ich möchte Anthere-Thread öffnen, um mit Daten einzufügen, und Hauptthread-Antwort-Client früh. (Hauptthread ist in Controller). –

+0

der zweite Thread Deal mit Daten einfügen, Haupt-Thread nicht warten, zweiten Thread fertig. –

+0

@HamiltonLin - Bitte beachten Sie meine Antwort aktualisiert –

0

@Async sollte zunächst in den @Configuration bean aktiviert werden:

@Configuration 
@EnableAsync 
public class AppConfiguration { 

    [...] 
} 

für XML-Konfiguration fügen Sie diese: <task:annotation-driven>

+0

Ich setze in meine spring.xml-Datei, dann funktioniert es gut mit @ Async.Don't enable @Configuration! –

+0

Eigentlich verliere ich die Aufgabenstellung in meiner spring.xml Datei \ –

+1

'.' Verwendet werden soll, wenn Sie XML-Konfiguration – dit

Verwandte Themen