2017-09-27 1 views
0

J'ai un nouvel aspect que je voudrais appliquer @Around une méthode de service annotée avec @HystrixCommand. En raison de l'annotation, le HystrixCommandAspect est automatiquement appliqué.Commande d'aspect tiers au printemps

Cependant, HystrixCommandAspect ne définit pas de @Order, ce qui, je le soupçonne, signifie qu'il est par défaut Integer.MAX_VALUE (c'est-à-dire qu'il doit être exécuté en dernier). J'ai besoin que mon aspect s'exécute en dernier car le HystrixCommandAspect exécute la méthode de service sur un thread différent et mon aspect doit s'exécuter sur ce thread (la raison n'est probablement pas importante ici, mais cela implique le stockage local de threads).

Il semble que lorsqu'il y a une égalité dans @Order, l'ordre est en quelque sorte déterminé par le balayage des composants de Spring. Y at-il un moyen de spécifier manuellement l'ordre que Spring devrait appliquer ces aspects (étant donné que je ne peux pas changer le @Order de HystrixCommandAspect)?

+0

J'ai creusé un peu plus et je soupçonne que ceci est lié à l'auto-configuration de spring boot. Hystrix définit ses propres springfactory, qui référence HystrixCircuitBreakerConfiguration, exposant un bean hystrixCommandAspect. Je suis capable de remplacer ce bean avec ma propre classe de configuration (le override ne semble fonctionner que si j'utilise aussi la configuration automatique pour ma config), qui est un copier-coller de l'aspect de Hystrix avec une annotation @Order. Cependant, ma deuxième classe d'aspect ne semble jamais être ajoutée, que j'utilise la configuration automatique pour l'ajouter ou non. – nmittler

+0

Il s'avère que 'HystrixCommandAspect' appelle directement la méthode plutôt que de procéder à' JoinPoint'. C'est pourquoi l'aspect qui suit n'est jamais invoqué. J'ai soulevé un [bug Hystrix] (https://github.com/Netflix/Hystrix/issues/1684). – nmittler

Répondre

0

Vous pouvez essayer d'utiliser le @DeclarePrecedence, par exemple:

import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.DeclarePrecedence; 

@Aspect 
@DeclarePrecedence("*, com.example.HystrixCommandAspect, com.example.YourCustomAspect") 
public class AspectOrder { 
} 

Probablement, il faudrait que vous passez à AspectJ.

+0

Hystrix semble utiliser la configuration automatique de démarrage au printemps, donc je ne suis pas certain de savoir comment cela va jouer avec AspectJ. La configuration automatique semble faire son truc, indépendamment de ce que je spécifie dans 'aop.xml'. – nmittler

+0

Il n'y a aucune possibilité d'expliquer ici toute la théorie du travail avec aspectj et le printemps. Vous feriez mieux de lire le chapitre correspondant dans le manuel de référence du ressort officiel et de passer du temps à lire leur code. En résumé, il ne mesure pas pour AspectJ qui définit les aspects. Vous avez juste besoin de définir leurs emplacements. Du point de vue du printemps, vous n'avez rien à faire (AspectJ assume toute la responsabilité). Mais s'il y a un besoin pour certains aspects de devenir des beans (par exemple pour DI), alors vous devrez les instancier via la méthode spéciale "aspectOf". – Ivan