2012-11-08 37 views
6

Tôi muốn đo thời gian của yêu cầu HTTP GET của cuộc gọi RestTemplate.getForObject mà không cần thời gian để phân tích cú pháp phản hồi. Vì vậy, chỉ cần thời gian cuộc gọi HTTP từ xa cần. Tôi đã cố gắng thiết lập một ClientHttpRequestInterceptor nhưng tôi không nghĩ rằng đây là đúng cách để làm điều đó như thời gian có vẻ là sai:Đo thời gian khôi phục SpringTemplate HTTP

public class PerfRequestSyncInterceptor implements ClientHttpRequestInterceptor { 
private Logger log = Logger.getLogger(this.getClass()); 

@Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, 
     ClientHttpRequestExecution execution) throws IOException { 

    long start = System.nanoTime(); 
    ClientHttpResponse resp = execution.execute(request, body); 

    log.debug("remote request time: " 
      + ((System.nanoTime() - start) * Math.pow(10, -9))); 
    return resp; 
    } 
} 


Gọi:

RestTemplate rest = new RestTemplate(); 
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
interceptors.add(new PerfRequestSyncInterceptor()); 
rest.setInterceptors(interceptors); 

Response inob = rest.getForObject(xmlURL, Response.class); 

Làm thế nào tôi có thể đo thời gian một yêu cầu HTTP RestTemplate?

+0

Tôi đã gặp vấn đề tương tự. Bạn cần thực hiện cuộc gọi phương thức trên đối tượng phản hồi để chặn thực thi cho đến khi có phản hồi. – jaydfwtx

Trả lời

4

Bạn có thể sử dụng AOP và được xây dựng trong PerformanceMonitorInterceptor của Spring. Bạn cần phải xác định chính xác phương pháp nào mà bạn muốn chặn sau đó bạn có thể đo lường. Bạn có thể định cấu hình nó như sau:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> 
    <bean id="springMonitoredService" 
     class="com.myorg.service.springmon.MyServiceSpringImpl"/> 


    <bean id="springMonitoringAspectInterceptor"   
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"> 
     <property name="loggerName"  
       value="com.myorg.SPRING_MONITOR"/>  
    </bean> 


    <aop:config> 
      <aop:pointcut id="springMonitoringPointcut" 
        expression="execution(* java.net.HttpURLConnection.connect(..))"/> 




       <aop:advisor pointcut-ref="springMonitoringPointcut" 
      advice-ref="springMonitoringAspectInterceptor"/>  
    </aop:config> 

</beans> 
+0

Tôi nên định cấu hình phương pháp nào để đo lường? – Mannaz

+0

Nội bộ RestTemplate sử dụng java.net.HttpURLConnection bạn sẽ cần phải đo lường phương thức connect(). Ngoài ra, bạn có thể thử phương thức getDoOutput() quá –

+0

Tôi có thể yêu cầu bạn cập nhật câu trả lời của bạn để trỏ đến phương pháp này không? – Mannaz

1

Bạn có thể sử dụng StopWatch để thực hiện điều đó.

public class PerfRequestSyncInterceptor implements ClientHttpRequestInterceptor { 

    private final static Logger LOG = LoggerFactory.getLogger(PerfRequestSyncInterceptor.class); 

    @Override 
    public ClientHttpResponse intercept(HttpRequest hr, byte[] bytes, ClientHttpRequestExecution chre) throws IOException { 
     Stopwatch stopwatch = Stopwatch.createStarted(); 
     ClientHttpResponse response = chre.execute(hr, bytes); 
     stopwatch.stop(); 

     LOG.info("method=" + hr.getMethod() + ", uri="+hr.getURI() + ", response_time=" + stopwatch.elapsed(TimeUnit.MILLISECONDS) + ", response_code=" + response.getStatusCode().value()); 

     return response; 
    } 
} 

Và trong lớp nơi restTemplate được instanced

private final List<ClientHttpRequestInterceptor> requestInterceptors = new ArrayList<>(); 
requestInterceptors.add(new PerfRequestSyncInterceptor()); 
this.restTemplate.setInterceptors(requestInterceptors); 
0

Tôi muốn đo thời gian của yêu cầu HTTP GET của một cuộc gọi RestTemplate.getForObject mà không có thời gian cần thiết cho phân tích phản hồi

Tôi có cùng yêu cầu. Tôi muốn biết thời gian phản hồi của máy chủ để đánh giá thời gian máy chủ phản hồi mà không cần bất kỳ xử lý phản hồi RestTemplate nào. Tôi đã thêm hai máy đánh chặn vào HttpClientBuilder với một bản đồ để tôi có thể đo thời gian giữa yêu cầu và phản hồi mức thấp.

HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); 

// Attach interceptors 
ResponseTimeInterceptor interceptor = new ResponseTimeInterceptor(); 
httpClientBuilder.addInterceptorFirst((HttpRequestInterceptor) interceptor); 
httpClientBuilder.addInterceptorFirst((HttpResponseInterceptor) interceptor); 

// Use client with RestTemplate or on its own 
HttpClient client = httpClientBuilder.build(); 

Dưới đây là tối thiểu dual-nhiệm vụ đánh chặn:

public class ResponseTimeInterceptor implements HttpRequestInterceptor, HttpResponseInterceptor { 
    private final Map<HttpContext, Long> requestMap = new MaxSizeHashMap<>(50); 

    @Override 
    public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException { 
     requestMap.put(httpContext, System.currentTimeMillis()); 
    } 

    @Override 
    public void process(HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException { 
     long startTime = requestMap.getOrDefault(httpContext, 0L); 
     long diff = System.currentTimeMillis() - startTime; 
     System.out.println("Response time: " + diff + "ms"); 
    } 
} 

Sau khi trở về phản ứng đánh chặn, các dữ liệu phản ứng tiếp tục vào xử lý phản ứng RestTemplate.

Lưu ý: MaxSizeHashMap được lấy từ https://stackoverflow.com/a/5601377.

Các vấn đề liên quan