簡體   English   中英

在Spring Java中同時調用多Web服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM