3

J'ai une question à propos de l'annotation Spring @Async. J'ai un contrôleur autowired un service (GnInsuranceDetailsService)Spring @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 
    } 

Et la méthode de service insertGnInsuranceDetail Je déclare méthode @Async up.

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

Je mis la @Async pour la méthode de service pour augmenter le temps de réponse du contrôleur pour le côté client, mais il ne fonctionne pas comme je le pense. Est-ce que je perds quelque chose? Ou comment puis-je modifier de la manière la plus simple?

Répondre

3

Vous ne perdrez rien, lorsque vous mettez @Async dans le service de la méthode sera exécuté dans un thread différent, la méthode insertDetail des contrôleurs ne sera pas retournée tant que votre insertGnInsuranceDetail n'est pas retourné ou levé une exception.

+0

Hellow, @ kuhajeyan.I utiliser le code de test Thread. sleep (10000L) devant la méthode insertGnInsuranceDetail begin.but not work.Controller attendra> 10s pour que la méthode insertGnInsuranceDetail du service soit terminée. –

+0

@HamiltonLin êtes-vous sûr que vous avez activé @ EnableAsync dans la configuration de @ Async pour fonctionner – kuhajeyan

+0

Comment configurer cette config au printemps –

0

J'ai mis le @Async pour la méthode de service pour augmenter le temps de réponse du contrôleur pour le côté client, mais cela ne fonctionne pas comme je le pense.

@Async - Annotation qui marque une méthode en tant que candidat pour l'exécution asynchrone. Peut également être utilisé au niveau du type, auquel cas toutes les méthodes du type sont considérées comme asynchrones.

Cette annotation @Async ne vous aidera pas à retarder le temps de réponse. Pour introduire un retard, utilisez Thread.sleep(milliseconds);


Si vous voulez thread principal (contrôleur) attendre fil d'insertion de données pour obtenir un résultat (réussite/échec), vous pouvez simplement invoquer le code de la couche db du contrôleur. Alors que si vous voulez que la réponse du client soit envoyée plus tôt, créez un nouveau thread dans le contrôleur et utilisez ce thread pour insérer des données. Dans la dernière approche de créer un nouveau thread pour insérer des données, votre client ne connaîtra pas l'état de l'insertion de données, puisque le thread est créé dans le contrôleur et qu'il se terminera dans le contrôleur, aucun retour/réponse ne peut être donné au client , puisque nous n'aurons pas de détails sur les clients.

Espérons que ça aide!

Référence: https://www.tutorialspoint.com/java/lang/thread_sleep_millis.htm

+0

Je veux ouvrir un thread d'anthère pour gérer les données d'insertion, et le client de réponse du thread principal au début (le thread principal est dans le contrôleur). –

+0

le deuxième thread traite avec les données d'insertion, le thread principal n'attend pas le deuxième thread terminé. –

+0

@HamiltonLin - S'il vous plaît voir ma réponse mise à jour –

0

@Async doit être d'abord activé dans votre @Configuration haricot:

@Configuration 
@EnableAsync 
public class AppConfiguration { 

    [...] 
} 

pour la configuration xml ajouter ceci: <task:annotation-driven>

+0

Je place dans mon fichier spring.xml, alors ça fonctionne bien avec @ Async.Ne pas activé @Configuration! –

+0

En fait, je perds le réglage de la tâche dans mon fichier spring.xml. \ –

+1

'' devrait être utilisé si vous utilisez la configuration xml – dit