2017-02-17 1 views
1

J'utilise l'application Spring et nous avons une architecture SOA basée sur l'API REST. J'ai maintenant une API par exemple créer un utilisateur (http://myapp/api/createUser)Comment implémenter le comportement asynchrone en réponse à l'envoi de courrier électronique pendant que la réponse revient en Java

Alors maintenant, quand un utilisateur est créé, nous devons envoyer un email à l'utilisateur tout de suite. Je l'ai implémenté mais il attend la méthode email pour envoyer un email et retourner le succès/l'échec, qui consomme du temps.

Comment répondre immédiatement à une réponse de l'API en démarrant la partie de courrier électronique dans le fil de discussion et en l'exécutant en arrière-plan et en envoyant le courrier à l'utilisateur. ou en cas d'échec, puis connecté dans la base de données.

S'il vous plaît me suggérer l'API ou le cadre pour que je ne veux pas implémenter Messaging Queue comme Rabbit MQ ou Active Queue. Veuillez partager ces implémentations qui ne créent pas de problème dans le serveur de production en direct en générant des threads.

Répondre

2

Utilisez @Async dans votre méthode d'envoi de courrier électronique.

Ref: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/Async.html

Exemple:

@Async 
public void sendNotificaitoin(User user) throws MailException {  
    javaMailSender.send(mail); 
} 

Pour permettre @Async de travailler, utiliser @EnableAsync dans votre configuration.

@SpringBootApplication 
@EnableAsync 
public class SendingEmailAsyncApplication {  
    public static void main(String[] args) { 
     SpringApplication.run(SendingEmailAsyncApplication.class, args); 
    } 
} 

Utilisez comme ci-dessous:

 @RequestMapping("/signup-success") 
     public String signupSuccess(){ 

      // create user 
      User user = new User(); 
      user.setFirstName("Dan"); 
      user.setLastName("Vega"); 
      user.setEmailAddress("[email protected]"); 

      // send a notification 
      try { 
       notificationService.sendNotificaitoin(user); 
      }catch(Exception e){ 
       // catch error 
       logger.info("Error Sending Email: " + e.getMessage()); 
      } 

      return "Thank you for registering with us."; 
     } 
+0

Je pense que la réponse ne sera pas reçue jusqu'à ce notificationService.sendNotificaitoin (utilisateur); est fini d'envoyer. Est-ce que confirmer? et envoyer la documentation si cela est écrit quelque part. –

+0

non, s'il vous plaît vérifier en cours d'exécution. sendNotificaitoin() est marqué comme async(). – mhshimul

+0

J'ai essayé de déboguer toujours les comportements synchrones get. J'ai mis @Async à ma méthode et comme je n'utilise pas spring boot, j'ai ajouté dans app-config.xml. Vous ne savez pas où ajouter EnableAsync ?. Pouvez-vous aider s'il vous plaît. –