【问题标题】:Use Aspects in Spring to calculate method processing time在 Spring 中使用 Aspects 计算方法处理时间
【发布时间】:2016-01-15 11:10:45
【问题描述】:

我有一个 Spring MVC Web 应用程序,它连接到外部 Web 服务以进行不同的操作。为了计算 Web 请求的服务响应时间,我使用 aspectj 来记录服务调用。我可以完美记录执行 web 服务方法所花费的时间。

但我也想在 HTML 视图中显示这些响应时间。我找不到让这个时间价值回到视图的方法。非常感谢您的想法。

这是我使用 sl4j 将这些时间记录到 CSV 文件的方法。

@Around("execution(* backend.channel.ServiceWrapper.*(..))")
public Object logAroundServiceCall( ProceedingJoinPoint joinPoint ) throws Throwable
{
    StopWatch sw = new StopWatch();
    sw.start();
    Object returnVal = null;
    try
    {
        returnVal = joinPoint.proceed();
    }
    catch ( Exception e )
    {
        LOGGER.error( e.getMessage(), e );
    }
    finally
    {
        sw.stop();
        SERVICE_TIME_LOGGER.info( "{},{}", joinPoint.getSignature().getName(), sw.getTotalTimeMillis() );
    }
    return returnVal;
}

【问题讨论】:

    标签: java spring-mvc aop aspectj thymeleaf


    【解决方案1】:

    可能有很多方法可以做到这一点,我给你两种可能性:

    1. 更简单但不太优雅的方法:您可以使用ThreadLocal 变量。 ThreadLocal 变量是一种用于存储任意值的每线程存储方法。您的建议可以将您的分析结果列表存储在 ThreadLocal 中,并在您的请求/响应周期的稍后位置执行代码,该循环收集数据、清除 ThreadLocal 并将其呈现在 UI 中。
    2. 稍微难一点,但更优雅的方法:将分析数据的集合想象为事件生产者,将 UI 渲染器的数据收集器部分想象为这些事件的消费者,稍后在渲染中渲染它们服务调用全部完成的阶段。您只需要使用事件系统设置您的方面,以便它可以在事件发生时发布事件,并注册您的 UI 渲染器以侦听这些事件。使用AspectName.aspectOf() 获取单例方面的实例,并将其用作几乎任何 POJO 来设置您的事件系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      相关资源
      最近更新 更多