在春天Boot2中使用CompletableFuture的方法教程

  

  

在春天引导中有一个注释@Async,可以帮助开发人员开发并发应用程序。但使用此功能非常棘手。在本博客中,我们将了解如何将此功能与CompletableFuture一起使用。我认为你已经知道关于CompletableFuture的基础,所以我不会在这里重复这个概念。

  

首先,您需要使用@EnableAsync来注释您的应用程序类,这个注释告诉春查找使用@Async注释的方法并在单独的执行程序中运行它们。

        @SpringBootApplication   @EnableAsync   公共类应用{   创建RestTemplate   公共静态void main (String [] args) {   SpringApplication.run (App.class, args);   }   }      

如果您查看有关使用CompletableFuture和@Async的弹簧引导示例,您会注意到他们使用此功能的方式基于休息请求,在我看来,我相信,它有点受限,它不会给你在其他情况下如何使用此功能的线索。例如,如果你有一个长期运行的任务,你会怎么做?

     //来源:https://spring.io/guides/gs/async-method/包你好;      进口org.slf4j.Logger;   进口org.slf4j.LoggerFactory;   进口org.springframework.boot.web.client.RestTemplateBuilder;   进口org.springframework.scheduling.annotation.Async;   进口org.springframework.stereotype.Service;   进口org.springframework.web.client.RestTemplate;      进口java.util.concurrent.CompletableFuture;      @ service   公开课GitHubLookupService {      私有静态最终日志记录器=LoggerFactory.getLogger (GitHubLookupService.class);      私人最终创建RestTemplate创建RestTemplate;      公共GitHubLookupService (RestTemplateBuilder RestTemplateBuilder) {   这一点。创建restTemplate=restTemplateBuilder.build ();   }      @Async   公共CompletableFuturefindUser (String用户)抛出InterruptedException {   logger.info(“查找”+用户);   字符串url=String.format (“https://api.github.com/users/%s”、用户);=创建restTemplate用户结果。getForObject (url, User.class);//人工延迟1 s出于演示目的   thread . sleep (1000 l);   返回CompletableFuture.completedFuture(结果);   }      }      

在FindUser (String用户)中,它在主线程中使用CompletableFuture,此方法的主要任务是使用创建RestTemplate从github获取数据,功能是“执行HTTP请求的同步客户端”。如何使用长时间运行的任务,如调用网络功能,如从其他端点萍服务器?在这种情况下,您需要定制CompletableFuture。你不能简单地调用:

        返回CompletableFuture.completedFuture(结果);      

  

要在代码中使用@Async,您的方法必须返回未来或CompletableFuture,看一下下面的例子:

        @Async   公共CompletableFutureisServerAlive (String ip) {   CompletableFuture未来=new CompletableFuture () {   @Override   公共Boolean()抛出InterruptedException, ExecutionException {   InetAddress地址=零;   尝试{   地址=InetAddress.getByName (ip);   返回address.isReachable (1000);   }捕捉(UnknownHostException e) {   e.printStackTrace ();   返回错误;   }捕捉(IOException e) {   e.printStackTrace ();   返回错误;   }   }   };   返回未来;   }      

在这个例子中,我重写了得到()方法并返回CompletableFuture而没有任何线程执行器,事实上我们要求春在不同的线程中执行@Async方法,但是我们不提供任何线程执行器,只有后台工作者中运行就足够了。

  

从github 下载源代码;(本地下载)

  

在这个例子中,我决定在春天引导中使用一个网络函数,仅仅是为了一个参数。但最好不要在其他端点中直接使用网络功能,特别是当您希望立即获得结果时。原因是:网络功能是阻塞的,这意味着,如果你调用这端个休息点,您必须在端点等待获取结果。强烈建议使用其他方法(如队列或推动方法)(例如websocket)来调用阻塞函数。

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

在春天Boot2中使用CompletableFuture的方法教程