package com.zd.resttemplate.controller;
import com.zd.resttemplate.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
* @author zhaodeng
* @date 2020/07/24 22:13
*/
@org.springframework.web.bind.annotation.RestController
public class RestController {
private final RestTemplate restTemplate;
@Autowired
public RestController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/request")
public Result request(@RequestParam("url") String url,
@RequestParam("count") Integer count,
@RequestParam("concurrent") Integer concurrent) {
ExecutorService executorService = Executors.newFixedThreadPool(concurrent);
List<Future<Long>> futures = new ArrayList<>(count);
restTemplate.getForObject(url, String.class);
for (int i = 0; i < count; i++) {
futures.add(executorService.submit(() -> {
long start = System.currentTimeMillis();
restTemplate.getForObject(url + "?t=" + System.nanoTime(), byte[].class);
return System.currentTimeMillis() - start;
}));
}
List<Long> durationList = futures.stream().map(f -> {
try {
return f.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return 0L;
}).sorted(Comparator.comparingLong(i -> i)).collect(Collectors.toList());
Result result = new Result();
result.setAverage(durationList.stream().mapToLong(l-> l).average().orElse(-1d));
result.setOrder95(durationList.get(94));
System.out.println(durationList);
return result;
}
}
评论