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

作者:banq 时间:2022-09-27 14:18:51 

前言

在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)来调用阻塞函数。

来源:https://www.jdon.com/51288

标签:springboot2,completablefuture
0
投稿

猜你喜欢

  • Java 实现订单未支付超时自动取消功能(京东商城为例)

    2023-04-20 17:08:06
  • Android 6.0以上权限拒绝打开权限设置界面的解决方法

    2021-11-07 01:59:35
  • Java JDBC导致的反序列化攻击原理解析

    2023-09-24 15:38:42
  • Android仿IOS ViewPager滑动进度条

    2022-10-31 08:27:38
  • Android自定义View之渐变色折线图的实现

    2023-09-23 21:43:03
  • Java实现图形界面计算器

    2023-06-05 11:53:23
  • Android购物车项目快速开发

    2021-09-11 01:28:07
  • HttpServletResponse乱码问题_动力节点Java学院整理

    2021-10-18 17:48:51
  • SpringBoot集成Shiro进行权限控制和管理的示例

    2022-12-31 19:23:21
  • Android实现拼图游戏

    2023-06-29 20:48:25
  • Android开发之App widget用法实例分析

    2021-09-18 16:25:54
  • 浅谈一下Servlet的定义以及运行原理

    2023-08-14 10:50:07
  • Spring MVC Mybatis多数据源的使用实例解析

    2022-02-13 20:37:19
  • SpringBoot带你实现一个点餐小程序

    2022-04-01 23:38:08
  • Android App中实现向右滑动销毁功能的要点解析

    2022-09-14 11:25:17
  • Docker下搭建一个JAVA Tomcat运行环境的方法

    2022-01-13 14:13:29
  • Java设计模式之享元模式

    2022-09-23 12:16:07
  • Android实现绘制折线图APP代码

    2022-12-10 07:50:02
  • java中form以post、get方式提交数据中文乱码问题总结

    2022-12-15 06:53:59
  • 图解JVM垃圾内存回收算法

    2023-10-13 17:24:35
  • asp之家 软件编程 m.aspxhome.com