[英]Calling mutiple webservice at same time in Spring Java
我有30台服务器的列表,我必须对每个服务器进行REST调用以获取其状态。 目前,我遍历服务器列表,并针对每个服务器依次调用每个REST调用。 因此,将结果返回到JSP VIEW总共需要大约30秒才能从每个服务器获得响应。
我们该怎样改进这个?
您可以考虑的一种选择是Java8流,例如:
public void check() {
List<String> endPoints = Arrays.asList("http://www.google.com", "http://www.stackoverflow.com", "inexistent");
{
// this will execute the requests in parallel
List<Boolean> collected = performCheckOverStream(endPoints.parallelStream());
System.out.println(collected);
}
{
// this will execute the requests in serial
List<Boolean> collected = performCheckOverStream(endPoints.stream());
System.out.println(collected);
}
}
private List<Boolean> performCheckOverStream(Stream<String> stream) {
List<Boolean> collected = stream.map(new Function<String, Boolean>() {
@Override
public Boolean apply(String t) {
// do what you need here
}
}).collect(Collectors.toList());
return collected;
}
使用Spring,您可以使用@Async
注释的方法,甚至可以使用AsyncRestTemplate,在两种情况下,您都将收到Future<?>
。 一个很好的介绍@Async
可以发现这里和到AsyncRestTemplate
这里 。
您可以像这样通过ThreaPool通过线程计数作为API调用计数来实现。
public void REST_Thread_executor(int Thread_count, ArrayList URLS) {
ExecutorService executor = Executors.newFixedThreadPool(Thread_count);
for (int i = 0; i < Thread_count; i++) {
String URL = URLS.get(i).toString();
Runnable worker = new MyRunnable(URL);
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
}
}
public String restAPICALL(URL) {
GET or POST or PUT or DELETE
}
public static class MyRunnable implements Runnable {
private final String URL;
RESTThreadExecutor restThreadExecutor = new RESTThreadExecutor();
MyRunnable(String URL) {
this.URL = URL;
}
@Override
public void run() {
restThreadExecutor.restAPICALL(URL);
}
}
您可以使用Java 9中的CompletableFuture接口。或者在应用程序上启用@EnableAsync,并在方法上使用@Async,它将返回给您一个Future接口。 两者都是异步流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.