如何在 javax.servlet.Filter 中注入 ResourceInfo
How to inject ResourceInfo in javax.servlet.Filter
我正在尝试根据服务方法注册时间指标,但无法注入 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 {
}
}
如何在javax.servlet.Filter
中注入ResourceInfo
?
尝试使用 JAX-RS 过滤器。这些操作就像 Servlet 过滤器一样,但更好,因为它们在 JAX-RS 的范围内并且可以做很多 Servlet 过滤器不能做的事情。
为此,只需让 class 实现 ContainerResponseFilter
和 ContainerRequestContext
,并将其添加到您的 JAX-RS 应用程序(即添加 @Provider
注释或将其添加到您的 web.xml
)。然后实现这两个方法。您可以将 startTime
存储在 RequestContext
对象的参数中。
我将使用 link 将其编辑到我自己的过滤器中,当我有机会时它会执行此操作。
我已经使用 ContainerRequestFilter
和 ContainerResponseFilter
来解决这个问题。
ContainerRequestFilter:
@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());
}
}
容器响应过滤器:
@Provider
@Priority(Priorities.USER)
public class ResponseLogFilter implements ContainerResponseFilter{
private Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class);
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
try {
Instant end = Instant.now();
Instant start = (Instant) requestContext.getProperty(RequestContextLoggingFilter.REQUEST_START_TIME);
logger.info("Done executing request with request_execution_time={} ms",
Duration.between(start, end).toMillis());
}catch (Exception e){
logger.warn("error logging response time", e);
}
}
}
您还可以使用 Jersey 的监控和诊断模块:https://jersey.github.io/documentation/latest/monitoring_tracing.html。
我还没有在生产应用程序中使用它,因为它在版本 >2.1
中处于测试阶段
我正在尝试根据服务方法注册时间指标,但无法注入 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 {
}
}
如何在javax.servlet.Filter
中注入ResourceInfo
?
尝试使用 JAX-RS 过滤器。这些操作就像 Servlet 过滤器一样,但更好,因为它们在 JAX-RS 的范围内并且可以做很多 Servlet 过滤器不能做的事情。
为此,只需让 class 实现 ContainerResponseFilter
和 ContainerRequestContext
,并将其添加到您的 JAX-RS 应用程序(即添加 @Provider
注释或将其添加到您的 web.xml
)。然后实现这两个方法。您可以将 startTime
存储在 RequestContext
对象的参数中。
我将使用 link 将其编辑到我自己的过滤器中,当我有机会时它会执行此操作。
我已经使用 ContainerRequestFilter
和 ContainerResponseFilter
来解决这个问题。
ContainerRequestFilter:
@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());
}
}
容器响应过滤器:
@Provider
@Priority(Priorities.USER)
public class ResponseLogFilter implements ContainerResponseFilter{
private Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class);
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
try {
Instant end = Instant.now();
Instant start = (Instant) requestContext.getProperty(RequestContextLoggingFilter.REQUEST_START_TIME);
logger.info("Done executing request with request_execution_time={} ms",
Duration.between(start, end).toMillis());
}catch (Exception e){
logger.warn("error logging response time", e);
}
}
}
您还可以使用 Jersey 的监控和诊断模块:https://jersey.github.io/documentation/latest/monitoring_tracing.html。
我还没有在生产应用程序中使用它,因为它在版本 >2.1
中处于测试阶段