【问题标题】:Spring Transaction - Log method execution time on new transactionSpring Transaction - 记录新事务的方法执行时间
【发布时间】:2017-07-19 10:04:52
【问题描述】:

我有一个 aspect-j 方面(在编译时编织)来记录方法名称和执行时间,当最后一个大于 1 秒时。

日志被聚合在一个 ELK 堆栈中,我们想要进行分析可视化,问题是堆栈中的所有子调用也被跟踪,并且我们有多个跟踪,每个工作单元都有多个方法名称。

我只想跟踪每个工作单元的入口点方法,即。每个方法都会触发一个新事务(而不是加入现有事务的那个)。

有没有办法在不覆盖 spring TransactionInterceptor 的情况下这样做?

【问题讨论】:

    标签: java spring transactions profiling aspectj


    【解决方案1】:

    如果您需要一个仅使用 AspectJ 的简单解决方案,以下可能对您有用。

    假设你有一个命名的切入点transactionalMethodExecution

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

    您可以使用cflowbelow 排除最顶层控制流中所有嵌套的transactionalMethodExecution 切入点:

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

    来自cflowbelow上的文档:

    cflowbelow(Pointcut)

    Pointcut 选择的任何连接点P 的控制流中选择每个连接点,但不是P 本身。

    这个解决方案无疑是简单的,它不处理嵌套事务或任何更花哨的情况。对于这些情况,您需要更彻底的解决方案。

    【讨论】:

    • 我没有嵌套事务(JTA),这似乎正是我正在寻找的;简单优雅!如果您不介意,我稍后会测试并接受:)
    猜你喜欢
    • 2014-11-16
    • 2019-01-12
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多