中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Spring Boot2中使用CompletableFuture的方法教程

發布時間:2020-08-29 20:21:45 來源:腳本之家 閱讀:527 作者:banq 欄目:編程語言

前言

在Spring Boot中有一個注釋@Async,可以幫助開發人員開發并發應用程序。但使用此功能非常棘手。在本博客中,我們將了解如何將此功能與CompletableFuture一起使用。我認為你已經知道關于CompletableFuture的基礎,所以我不會在這里重復這個概念。

首先,您需要使用@EnableAsync來注釋您的應用程序類,這個注釋告訴Spring查找使用@Async注釋的方法并在單獨的執行程序中運行它們。

@SpringBootApplication
@EnableAsync
public class App {
 RestTemplate
 public static void main(String[] args) {
  SpringApplication.run(App.class, args);
 }
}

如果您查看有關使用CompletableFuture和@Async的Spring Boot示例,您會注意到他們使用此功能的方式基于REST請求,在我看來,我相信,它有點受限,它不會給你在其他情況下如何使用此功能的線索。例如,如果你有一個長期運行的任務,你會怎么做?

// Source : https://spring.io/guides/gs/async-method/
package hello;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.concurrent.CompletableFuture;

@Service
public class GitHubLookupService {

  private static final Logger logger = LoggerFactory.getLogger(GitHubLookupService.class);

  private final RestTemplate restTemplate;

  public GitHubLookupService(RestTemplateBuilder restTemplateBuilder) {
    this.restTemplate = restTemplateBuilder.build();
  }

  @Async
  public CompletableFuture<User> findUser(String user) throws InterruptedException {
    logger.info("Looking up " + user);
    String url = String.format("https://api.github.com/users/%s", user);
    User results = restTemplate.getForObject(url, User.class);
    // Artificial delay of 1s for demonstration purposes
    Thread.sleep(1000L);
    return CompletableFuture.completedFuture(results);
  }

}

在FindUser(String user)中,它在主線程中使用CompletableFuture,此方法的主要任務是使用RestTemplate從github獲取數據,功能是“執行HTTP請求的同步客戶端”。如何使用長時間運行的任務,如調用網絡功能,如從REST端點ping服務器?在這種情況下,您需要定制CompletableFuture。你不能簡單地調用:

return CompletableFuture.completedFuture(results);

如何使用CompletableFuture

要在代碼中使用@Async,您的方法必須返回Future或CompletableFuture,看一下下面的例子:

@Async
  public CompletableFuture<Boolean> isServerAlive(String ip) {
    CompletableFuture<Boolean> future = new CompletableFuture<Boolean>(){
      @Override
      public Boolean get() throws InterruptedException, ExecutionException {
        InetAddress address = null;
        try {
          address = InetAddress.getByName(ip);
          return address.isReachable(1000);
        } catch (UnknownHostException e) {
          e.printStackTrace();
          return false;
        } catch (IOException e) {
          e.printStackTrace();
          return false;
        }
      }
    };
    return future;
}

在這個例子中,我重寫了get()方法并返回CompletableFuture而沒有任何線程執行器,事實上我們要求Spring在不同的線程中執行@Async方法,但是我們不提供任何線程執行器,只有后臺工作者中運行就足夠了。

download source code from github (本地下載)

注意:在這個例子中,我決定在Spring Boot中使用一個網絡函數,僅僅是為了一個參數。但最好不要在REST端點中直接使用網絡功能,特別是當您希望立即獲得結果時。原因是:網絡功能是阻塞的,這意味著,如果你調用這個REST端點,您必須在端點等待獲取結果。強烈建議使用其他方法(如queue或push方法)(例如websocket)來調用阻塞函數。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岢岚县| 磐安县| 滨海县| 车致| 阜新| 盈江县| 乐业县| 衢州市| 阿克| 乳山市| 巨鹿县| 文山县| 闵行区| 横山县| 莎车县| 武义县| 巨野县| 城固县| 体育| 句容市| 工布江达县| 铁力市| 栾川县| 民权县| 兴仁县| 资阳市| 夏河县| 花垣县| 遂昌县| 呼伦贝尔市| 舒城县| 宣武区| 深圳市| 安远县| 墨江| 应城市| 右玉县| 海南省| 密山市| 吉水县| 乐业县|