我有一个方面-j方面(在编译时编织)来记录方法名称和执行时间,当这最后一个大于1时。
日志聚合在ELK堆栈中,我们希望进行性能分析可视化,问题是堆栈中的所有子查询也被跟踪,我们有多个跟踪,每个工作单元有多个方法名称。
我只想跟踪每个工作单元的入口点方法,即。每个方法触发一个新事务(而不是加入现有事务的事务)。
有没有办法在不覆盖spring TransactionInterceptor的情况下这样做?
答案 0 :(得分:1)
如果您只需要使用AspectJ的简单解决方案,以下内容可能对您有用。
我们假设你有一个名为切入点transactionalMethodExecution
:
pointcut transactionalMethodExecution(): execution(@org.springframework.transaction.annotation.Transactional * *(..));;
您可以使用cflowbelow
排除最顶层控制流中的所有嵌套transactionalMethodExecution
切入点:
transactionalMethodExecution() && !cflowbelow(transactionalMethodExecution())
来自cflowbelow
的文档:
cflowbelow(Pointcut)
在
P
选择的任何加入点Pointcut
的控制流中挑选出每个加入点,而不是P
本身。
这个解决方案无疑是简单化的,它不会处理嵌套事务或任何更奇特的事情。对于这些案例,您需要更全面的解决方案。