2017-07-19 104 views
0

我有一個aspect-j方面(在編譯時編織)記錄方法名稱和執行時間,當最後一個大於1秒時。Spring事務 - 在新事務中記錄方法執行時間

日誌集合在一個ELK堆棧中,我們希望進行剖析可視化,問題是堆棧中的所有子調用也會被跟蹤,並且我們對每個工作單元都有多個具有多個方法名稱的跟蹤。

我想只跟蹤每個工作單元的入口點方法,即。每種方法都會觸發新的事務(而不是加入現有事務的事務)。

有沒有辦法這樣做,而不覆蓋Spring TransactionInterceptor?

回答

1

如果您只需要使用AspectJ的簡單解決方案,以下內容可能適用於您。

假設你有一個名爲切入點transactionalMethodExecution

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

您可以通過使用cflowbelow排除在最上面的控制流中的所有嵌套transactionalMethodExecution切入點:

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

從文檔上cflowbelow

cflowbelow(Pointcut)

找出Pointcut挑選的任意連接點P的控制流中的每個連接點,但不是P本身。

這個解決方案無可厚非,它不處理像嵌套事務或任何更花哨的情況。對於這些情況,您需要更徹底的解決方案。

+0

我沒有嵌套事務(JTA),這看起來正是我要找的;簡單而優雅!如果你不介意,我會稍後再測試和接受:) – Gab