【问题标题】:Spring: Response time春季:响应时间
【发布时间】:2025-12-09 05:50:02
【问题描述】:

我有一个 SOAP 网络服务(spring ws)并且需要保存我收到的每个请求的响应时间。我可以创建一个 servlet 过滤器来测量 HTTP 请求和 HTTP 响应之间的时间差。但是,我需要将响应时间与从soap 请求信封中读取的一些值一起记录下来,并且由于那时请求是原始的并且需要解组,因此对每个请求进行解组是一项昂贵且冗余的操作。

那么有没有办法使用 SpringWS 来计算呢?就像在 payloadInterceptor 中一样?

【问题讨论】:

    标签: java spring spring-ws


    【解决方案1】:

    是的,实现EndpointInterceptor 最适合此任务,因为它使您可以通过MessageContext 访问SOAP 消息。请参阅Reference Documenation

    【讨论】:

    • 该接口的实现类有很多,哪一个最适合?我已经有一个 PayloadValidatorInterceptor,但是如何在该类中被覆盖的请求和响应方法之间传递值(requestTime)?那是单身
    • 您可以使用 MessageContext set/getProperty api 来保持请求和响应之间的某些状态。 EndpointInterceptorAdapter 可能最适合您实现拦截器
    【解决方案2】:

    我认为你可以使用两种工具。

    1. 带有注释@Before 和@AfterReturning 的AspectJ。切入点可以是接收请求的方法(@WebMethod)。

      @Before("call([package, class and method that receives the request]")
      public void before(JoinPoint joinPoint) throws Throwable {
          ...
      }
      
      @AfterReturning(pointcut = "call([package, class and method that receives the request])", returning = "result")
      public void after(JoinPoint joinPoint, Object result) throws Throwable {
          ...
      }
      

    JoinPoint 对象有方法的参数信息

    1. 覆盖实现 SOAPHandler 类的自定义类的方法 handleMessage。每次收到 SOAP 请求时都会执行此方法。

    我希望这可以为您提供解决问题的想法。

    【讨论】:

    • 我正在实现 Web 服务而不是使用它的客户端
    • 在 Web 服务中可以使用相同的方法。我编辑了我的答案。
    • SOAPHandler 是一个 JAX-WS/JEE 类,Spring-WS 不使用/不支持。