2017-07-19 1 views
0

Ich habe einen aspect-j-Aspekt (zur Kompilierungszeit gewebt), um den Methodennamen und die Ausführungszeit zu protokollieren, wenn dieser Wert größer als 1s ist.Spring Transaction - Ausführungszeit der Protokollmethode bei neuer Transaktion

Protokolle werden in einem ELK-Stack aggregiert und wir würden gerne Profiling-Visualisierung machen, das Problem ist, dass alle Unterklassen im Stack ebenfalls verfolgt werden und wir so mehrere Traces mit mehreren Methodennamen für jede Arbeitseinheit haben.

Ich möchte nur die Einstiegspunktmethode jeder Arbeitseinheit verfolgen, dh. Jede Methode löst eine neue Transaktion aus (und nicht diejenige, die einer bestehenden Transaktion beitritt).

Gibt es eine Möglichkeit, dies zu tun, ohne Feder TransactionInterceptor zu überschreiben?

Antwort

1

Wenn Sie eine einfache Lösung benötigen, die nur AspectJ verwendet, könnte das Folgende für Sie funktionieren.

Angenommen, Sie haben einen Namen pointcut transactionalMethodExecution:

pointcut transactionalMethodExecution(): execution(@org.springframework.transaction.annotation.Transactional * *(..));; 

Sie können alle verschachtelten transactionalMethodExecution pointcuts in dem Steuerfluss des obersten einen ausschließen, indem cflowbelow mit:

transactionalMethodExecution() && !cflowbelow(transactionalMethodExecution()) 

Aus der Dokumentation auf cflowbelow:

cflowbelow(Pointcut)

Fügt jeden Join-Punkt im Kontrollfluss eines beliebigen Verknüpfungspunkts P heraus, der von Pointcut ausgewählt wurde, aber nicht P.

Diese Lösung ist zugegebenermaßen zu einfach, es behandelt keine Fälle wie verschachtelte Transaktionen oder etwas ausgefalleneres. Sie benötigen eine gründlichere Lösung für diese Fälle.

+0

Ich habe keine verschachtelte Transaktion (JTA), das scheint genau das, wonach ich suche; Einfach und elegant! Ich werde etwas später testen und akzeptieren, wenn es Ihnen nichts ausmacht :) – Gab

Verwandte Themen