2017-08-06 1 views
1

Est-ce possible d'exécuter des méthodes annotées comme @After (dans la classe annotée comme @Aspec) asynchrone? Par exemple en utilisant annotation @Async ou implémente Runnable ou Callable. Et la même question pour les méthodes annotées comme @PostPersist.Exécution asynchrone de la classe @Aspect ou observateur d'événement JPA

Le véritable cas est l'envoi de courrier après l'enregistrement. Je ne veux pas exécuter la méthode à partir d'une méthode MailService in register car ce service aura trop de dépendances et sera difficile à tester. Mais l'envoi de courrier doit être exécuté de manière asynchrone car cette opération est très coûteuse.

Répondre

1

Cela ne devrait pas poser de problème. Commencer juste un nouveau fil dans la méthode "après" la méthode.

fonctionne AOP comme suit (par défaut):

Lorsque vous enregistrez un haricot qui nécessite certains aspects à appliquer, Spring crée un proxy autour de ce haricot et quand vous obtenez la fève du contexte d'application (par ctx.getBean(MyBean.class) ou par Autowire est quelque part) vous recevez le proxy qui a le bean réel/cible à l'intérieur.

Ainsi, par exemple, lorsque vous dites printemps pour exécuter une méthode après une méthode cible cela se produit:

  1. l'application appelle la méthode du proxy
  2. Si quelque chose doit être exécuté avant que la cible méthode (comme configuré action @Before) c'est fait.
  3. appeler la méthode réelle/cible
  4. Si quelque chose doit être exécuté après la méthode cible (comme l'action @After configurée), c'est fait.
  5. La méthode suivante dans la pile d'appel est exécuté

Donc, fondamentalement, avec @After vous venez « insérer » une méthode dans la pile d'appel. Vous pouvez démarrer un nouveau thread à partir de là, il renverra le contrôle immédiatement et la chose suivante après l'exécution de la méthode cible.