麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

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

2024-07-14 08:43:27
字體:
來源:轉載
供稿:網友

前言

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

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

@SpringBootApplication@EnableAsyncpublic 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;@Servicepublic 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)來調用阻塞函數。

總結

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品久久久久久久久亚洲 | 久久不射电影网 | 一区二区视频在线看 | 国产一区在线视频观看 | 高清国产午夜精品久久久久久 | 久久亚洲精品久久国产一区二区 | 成人区一区二区三区 | 免费观看黄视频 | 91一级毛片| 国产亚洲综合一区二区 | 久久91亚洲精品久久91综合 | 亚洲91网站 | 国产精品片一区二区三区 | 黄色试看视频 | 免费一级在线 | 久久99精品久久久久久国产越南 | 国产91av视频 | 特大黑人videos与另类娇小 | 中文字幕在线成人 | 毛片a区| 国产精品成人一区二区三区电影毛片 | av最新在线| 日韩欧美激情视频 | 日韩中字幕 | 婷婷亚洲一区二区三区 | 日韩欧美中文字幕视频 | 成人精品视频在线 | 免费观看黄色影片 | 国产精品视频专区 | 欧美成人精品一区二区 | 国产精品久久久久久久久久久久午夜 | 国产精品久久久久久久久久三级 | 日本一道aⅴ不卡免费播放 视屏一区 | 羞羞视频免费网站含羞草 | www.91sese| 中文字幕一区2区 | 久久久久久久一区二区 | 免费一级特黄欧美大片勹久久网 | 欧美va亚洲 | 国产精品久久久久久久久久妇女 | 美女擦逼 |