我正在尝试根据服务方法注册时间指标,但无法注入ResourceInfo。
我想写一些通用逻辑来根据服务注册时间。
这是我的代码:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.ws.rs.container.ResourceInfo;
@WebFilter("/*")
public class MetricsGeneraterFilter implements Filter {
@Context
private ResourceInfo resourceInfo;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
long startTime = System.currentTimeMillis();
chain.doFilter(request, response);
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println(resourceInfo.getResourceMethod().getName() + "--->" + elapsedTime);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
如何在ResourceInfo
注入javax.servlet.Filter
?
答案 0 :(得分:0)
请尝试使用JAX-RS过滤器。这些操作就像Servlet过滤器一样,但更好,因为它们在JAX-RS的范围内,可以做许多Servlet过滤器无法做到的事情。
为了做到这一点,只需将该类实现ContainerResponseFilter
和ContainerRequestContext
,并将其添加到您的JAX-RS应用程序(即添加@Provider
注释或将其添加到您的web.xml
)。然后实现这两种方法。您可以将startTime
存储在RequestContext
对象的参数中。
我将使用指向我自己的过滤器的链接对此进行编辑,当我有机会时,它会完成此操作。
答案 1 :(得分:0)
我已使用%{whateverRootBeanIs.dispatch.duplicateView}
和ContainerRequestFilter
来解决此问题。
ContainerRequestFilter:
ContainerResponseFilter
ContainerResponseFilter:
@Provider
public class RequestContextLoggingFilter implements ContainerRequestFilter{
public static final String REQUEST_START_TIME = "REQUEST_START_TIME";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.setProperty(REQUEST_START_TIME, Instant.now());
}
}
您还可以使用Jersey的监控和诊断模块:https://jersey.github.io/documentation/latest/monitoring_tracing.html。
我没有在生产应用程序中使用它,因为它在发行版> 2.1
时处于测试阶段