Spring Transaction - 记录新事务的方法执行时间
Posted
技术标签:
【中文标题】Spring Transaction - 记录新事务的方法执行时间【英文标题】:Spring Transaction - Log method execution time on new transaction 【发布时间】:2017-07-19 10:04:52 【问题描述】:我有一个 aspect-j 方面(在编译时编织)来记录方法名称和执行时间,当最后一个大于 1 秒时。
日志被聚合在一个 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
本身。
这个解决方案无疑是简单的,它不处理嵌套事务或任何更花哨的情况。对于这些情况,您需要更彻底的解决方案。
【讨论】:
我没有嵌套事务(JTA),这似乎正是我正在寻找的;简单优雅!如果您不介意,我稍后会测试并接受:)以上是关于Spring Transaction - 记录新事务的方法执行时间的主要内容,如果未能解决你的问题,请参考以下文章