当前位置: 首页 > 知识库问答 >
问题:

Spring Boot 2-WebClient:从一个控制器调用多个Rest API

谈炳
2023-03-14

我正在使用Spring Boot微服务,并致电下游获取数据。

要求从多个下游获取数据,并将响应聚合为单个响应。

有人可以帮助我如何在Get请求中进行并行rest调用吗。

下面是我可以一个接一个地调用that的简单方法。但是,我正在寻找并行调用。

@RestController
Class{

@GetMapping
method(){
    req1 = endpoint1;
    req2 = endpoint2;

    response = req1+req2; //How to achieve this using parallel processing.
}

请协助。谢谢

共有1个答案

武骁
2023-03-14

有很多方法可以实现并行执行。

一种方法可能是使用流:

// First prepare tasks you want to run in parallel
List<Supplier<Result>> tasks = new ArrayList<>();
tasks.add(() -> {
    Result result = // get result from WebClient
    return result;
});

// Next execute in parallel all tasks and collect results
List<Result> results = tasks.parallelStream()
        .map(Supplier::get)
        .collect(Collectors.toList());

// Merge results into one

当然,如果您想更好地控制线程(一次可以并行运行多少任务,不必为每个endpoint调用生成新线程等),那么由于您使用的是Spring Boot,您可以使用例如AsyncTaskExecutor

class MyAwesomeController {
    private final AsyncTaskExecutor executor;

    public MyAwesomeController() {
        executor = new TaskExecutorBuilder()
                .corePoolSize(5) // how many threads to keep alive
                .maxPoolSize(20) // how many max threads (taks) can be executed at one
                // Some other settings (eg. how long to keep idle thread alive etc.
                .build();
    }

    public Result endpoint() {
        // First prepare tasks you want to run in parallel
        List<Future<Result>> tasks = new ArrayList<>();
        tasks.add(executor.submit(() -> {
            Result result = // get result from WebClient
            return result;
        }));

        // Next collect results from Future
        List<Result> results = tasks.stream()
                .map(Future::get)
                .collect(Collectors.toList());
        
        // Merge results into one
    }

}

有关遗嘱执行人的更多信息,请参见:https://www.baeldung.com/java-executor-service-tutorial

 类似资料:
  • 我想在单击该按钮时从interface_pasienController上的Interface_adminController调用autoRefresh()方法。但是有一个错误“java.lang.NullPointerException”。代码怎么了? 线程“JavaFX Application thread”java.lang.RuntimeException中的异常:java.lang.Re

  • 问题内容: 我试图通过使用变量在第一控制器中调用第二控制器的方法。这是我的第一个控制器中的一种方法: 我可以设置的值,但是由于某种原因我不能打电话。控制台显示此错误: TypeError:对象#没有方法’getMainCategories’ 有没有一种方法可以调用上述方法? 编辑: 我使用以下方法同时加载两个应用程序。 我肯定可以在这里使用服务,但我想知道是否还有其他选择可以这样做! 问题答案:

  • 问题内容: 一个控制器可以使用另一个控制器吗? 例如: 该HTML文档仅在文件中打印由控制器传递的消息。 控制器文件包含以下代码: 它只是打印当前日期; 如果我要添加另一个控制器,它将特定格式的日期返回给,那么该怎么做呢?DI框架似乎与服务有关。 问题答案: 控制器之间有多种通信方式。 最好的一种可能是共享服务: 另一种方法是在范围内发出事件: 在这两种情况下,您都可以与任何指令进行通信。

  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢

  • 我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。

  • 问题内容: 我有一个由一个控制器控制的fxml文件。我想将控制器分成多个部分,就像放置在一个控制器中会产生很长的代码一样。不幸的是,fx:controller只能放在根目录中。我对如何分离控制器有什么建议吗? 问题答案: 我建议创建自定义控件-使用几个较小的FXML文件,而不是一个大FXML文件。 这是本教程: http://docs.oracle.com/javafx/2/fxml_get_st