2017-09-27 2 views
0

Ich habe einen neuen Aspekt, den ich anwenden möchte @Around eine Service-Methode mit @HystrixCommand kommentiert. Aufgrund der Anmerkung wird die HystrixCommandAspect automatisch angewendet.Bestellung von Dritten Aspekt im Frühjahr

HystrixCommandAspect definiert jedoch keine @Order, was bedeutet, dass es standardmäßig Integer.MAX_VALUE (d. H. Es sollte zuletzt ausgeführt werden). Ich brauche meinen Aspekt, um zuletzt zu laufen, weil die die Service-Methode auf einem anderen Thread ausführt und mein Aspekt auf diesem Thread ausgeführt werden muss (der Grund ist hier wahrscheinlich nicht wichtig, aber es beinhaltet lokalen Thread-Speicher).

Es scheint, dass, wenn es einen Gleichstand in @Order gibt, die Reihenfolge irgendwie von Frühling Komponente Scan bestimmt wird. Gibt es eine Möglichkeit, die Reihenfolge manuell festzulegen, in der Spring diese Aspekte anwenden soll (da ich die @Order von HystrixCommandAspect nicht ändern kann)?

+0

Ich habe etwas mehr graben gemacht und ich vermute, dass dies mit der automatischen Konfiguration des Springbootes zusammenhängt. Hystrix definiert seine eigenen spring.factories, die auf die HystrixCircuitBreakerConfiguration verweisen und eine hystrixCommandAspect-Bean anzeigen. Ich bin in der Lage, diese Bean mit meiner eigenen Konfigurationsklasse zu überschreiben (die Überschreibung scheint nur zu funktionieren, wenn ich auch die automatische Konfiguration für meine Konfiguration verwende), was ein Kopieren und Einfügen des Aspekts von Hystrix mit einer @Order-Anmerkung ist. Meine zweite Aspektklasse scheint jedoch nie hinzugefügt zu werden, unabhängig davon, ob ich die automatische Konfiguration verwende, um sie hinzuzufügen oder nicht. – nmittler

+0

Es stellt sich heraus, dass der 'HystrixCommandAspect' die Methode direkt aufruft, anstatt den' JoinPoint' auszuführen. Aus diesem Grund wird der folgende Aspekt nie aufgerufen. Ich habe einen [Hystrix-Fehler] (https://github.com/Netflix/Hystrix/issues/1684) ausgelöst. – nmittler

Antwort

0

Sie können versuchen, die @DeclarePrecedence, zum Beispiel zu verwenden:

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

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

wäre es erforderlich, dass Sie wahrscheinlich zu AspectJ wechseln.

+0

Hystrix scheint die automatische Konfiguration von Spring Boot zu verwenden, daher bin ich mir nicht sicher, wie das mit AspectJ funktionieren wird. Die automatische Konfiguration scheint ihren Zweck zu erfüllen, unabhängig davon, was ich in 'aop.xml' spezifiziere. – nmittler

+0

Es gibt keine Möglichkeit, hier die gesamte Theorie des Arbeitens mit aspectj und spring zu erklären. Sie sollten das entsprechende Kapitel im offiziellen Referenzhandbuch zum Federkern lesen und einige Zeit damit verbringen, ihren Code zu lesen. Kurz gesagt, es kommt nicht für AspectJ, die Aspekte definieren. Sie müssen nur ihre Standorte definieren. Aus Sicht des Frühlings müssen Sie überhaupt nichts tun (AspectJ übernimmt die gesamte Verantwortung). Aber wenn einige Aspekte benötigt werden, um Beans zu werden (z. B. für DI), müssen Sie sie über die spezielle Methode "aspectOf" instanziieren. – Ivan