我有一个aspect-j方面(在编译时编织)来记录方法名称和执行时间(当最后一个大于1秒时)。
日志聚合在 ELK 堆栈中,我们希望进行分析可视化,问题是堆栈中的所有子调用也被跟踪,并且每个工作单元都有多个方法名称的多个跟踪。
我只想跟踪每个工作单元的入口点方法,即。每个方法都会触发一个新事务(而不是加入现有事务的方法)。
有没有办法在不重写 spring TransactionInterceptor 的情况下做到这一点?
最佳答案
如果您需要一个仅使用 AspectJ 的简单解决方案,以下内容可能适合您。
假设您有一个命名切入点transactionalMethodExecution
:
pointcut transactionalMethodExecution(): execution(@org.springframework.transaction.annotation.Transactional * *(..));;
您可以使用 cflowbelow
排除最顶层控制流中的所有嵌套 transactionalMethodExecution
切入点:
transactionalMethodExecution() && !cflowbelow(transactionalMethodExecution())
摘自cflowbelow
的文档:
cflowbelow(Pointcut)
Picks out each join point in the control flow of any join point
P
picked out byPointcut
, but notP
itself.
这个解决方案确实很简单,它不处理嵌套事务或任何更奇特的情况。对于这些情况,您需要更彻底的解决方案。
关于java - Spring Transaction - 记录新事务的方法执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45187302/