如何在javax.servlet.Filter中注入ResourceInfo [英] How to inject ResourceInfo in javax.servlet.Filter

查看:102
本文介绍了如何在javax.servlet.Filter中注入ResourceInfo的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试根据服务方法注册时间指标,但无法注入ResourceInfo.

I am trying to register time metrics based on the service method but not able to inject ResourceInfo.

我想写一些通用的逻辑来根据服务注册时间.

I want to write some generic logic to register the time based on the service.

这是我的代码:

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?

推荐答案

我已经使用ContainerRequestFilterContainerResponseFilter来解决此问题.

I've used ContainerRequestFilter and ContainerResponseFilter to solve for this problem.

ContainerRequestFilter:

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());
    }
}

ContainerResponseFilter:

ContainerResponseFilter:

@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);
      }

  }
}

您还可以使用泽西岛的监视和诊断"模块: https://jersey.github .io/documentation/latest/monitoring_tracing.html .

You can also use Jersey's Monitoring and Diagnostics module: https://jersey.github.io/documentation/latest/monitoring_tracing.html.

我还没有在生产应用程序中使用过它,因为它从> 2.1发行版开始处于beta中.

I haven't used it in production applications as it is in beta as of release >2.1

这篇关于如何在javax.servlet.Filter中注入ResourceInfo的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆