gpt4 book ai didi

jax-rs - 如何在 JAX-RS 过滤器中记录请求处理时间

转载 作者:行者123 更新时间:2023-12-01 21:38:49 25 4
gpt4 key购买 nike

我有 JAX-RS 网络应用程序,我想记录从获取请求到响应的时间量。在带有 servlet 过滤器的 Spring Boot 中很容易。但是我的应用程序中的过滤器无法正常工作:

@Provider
public class RequestLogFilter implements ContainerRequestFilter, ContainerResponseFilter {

private long requestStartTime;

@Override
public void filter(ContainerRequestContext requestContext) {
requestStartTime = System.currentTimeMillis();
}

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
long requestFinishTime = System.currentTimeMillis();
System.out.println(requestFinishTime - requestStartTime);
}

}

它在第一种方法中工作正常,当前时间戳写入 requestStartTime。但是,似乎第二种方法有自己的 requestStartTime 变量副本,因为它始终为零。所以我无法计算变量之间的差异。我该怎么做才能记录请求处理时间?

最佳答案

由于您在同一个类中实现了 ContainerRequestFilterContainerResponseFilter,似乎创建了 2 个不同的实例,因此变量 requestStartTime两个实例之间是不同的。

此问题已在 Eclipse Jersey 项目上报告并被视为错误,已解决,请参阅 https://github.com/eclipse-ee4j/jersey/issues/3796 .

这里是整个讨论:https://github.com/eclipse-ee4j/jaxrs-api/issues/605 .

争论的焦点是此行为不符合 JAX-RS 规范(第 4.1 节):

By default a single instance of each provider class is instantiated for each JAX-RS application

但 Quarkus 使用 RESTEasy,所以我猜它不包含该修复。

无论如何,即使创建了单个实例(例如使用注释 @Singleton),您仍然不应该使用实例变量来保持开始时间,因为并发请求会覆盖它(感谢@areus 指出了这一点)。

相反,您可以在 ContainerRequestFilter.filter() 上保存 ContainerRequestContext 属性的开始时间,然后获取它并在 ContainerResponseFilter.filter( ):

@Provider
public class RequestLogFilter implements ContainerRequestFilter, ContainerResponseFilter {

@Override
public void filter(ContainerRequestContext requestContext) {
long requestStartTime = System.nanoTime();
requestContext.setProperty("requestStartTime", requestStartTime);
}

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
long requestStartTime = (long) requestContext.getProperty("requestStartTime");
long requestFinishTime = System.nanoTime();
long duration = requestFinishTime - requestStartTime;
System.out.println("duration: " + TimeUnit.NANOSECONDS.toMillis(duration) + " ms");
}
}

关于jax-rs - 如何在 JAX-RS 过滤器中记录请求处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61620936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com