首页 > 解决方案 > 如何在 java/groovy 中进行并行异步/解除阻塞 http post 调用

问题描述

我有以下正常工作的常规代码:

import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.util.concurrent.TimeUnit ;
import groovy.json.JsonOutput;

import java.io.IOException;

MediaType MEDIA_TYPE_PNG = MediaType.parse("multipart/form-data");
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(300, TimeUnit.SECONDS).readTimeout(300, TimeUnit.SECONDS)
.writeTimeout(300, TimeUnit.SECONDS)

  .build();
//MediaType mediaType = MediaType.parse("multipart/form-data");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("request","test.yaml",
    RequestBody.create(MEDIA_TYPE_PNG,
    new File("/home/user/test.yaml")))
  .build();

Request request = new Request.Builder()
  .url("https://mygateway.com")
  .method("POST", body)
  .addHeader("Content-Type", "multipart/form-data")
  .addHeader("Authorization", "token")
  .build();

Response response = client.newCall(request).execute();

int code = response.code();
def res =response.body().string()
def prettyResponseBody = JsonOutput.prettyPrint(res)
print(prettyResponseBody)

如何使此代码以异步方式并行运行?截至目前,我在 jenkins 的列表中有文件名列表,我正在并行运行,但我无法并行运行 http post 代码,因为我看到请求数量增加,时间也会随着请求的增加而增加。所以现在如果我有文件名列表,我如何以异步/非阻塞方式并行运行上述代码?由于 jenkins 的限制,无法使用线程/执行器服务。

如果可能的话,我正在寻找有关 Future/CompletableFuture 的一些选项,它们可以并行运行所有 7-8 个调用并等到所有调用完成?我该怎么做?

我试过什么?

  1. 执行服务
  2. 手动创建四个线程,但 1 和 2 在 jenkins pipleline 中不起作用
  3. 我没有尝试 Gpars,但我尝试了 Jenkins 并行阶段,我可以存储带有回调的地图,然后说“并行地图”以并行执行,然后所有后端任务并行启动 API 以使用 multipart 上传文件,正如我在代码中提到的,有点不是并行工作,因为 1 个请求需要 2 分钟,然后 3 个请求需要 6 分钟,4 个请求需要 8 分钟,依此类推。
  4. 我没有尝试 Gprs,因为我尝试了 jenkins parallel,它能够像我在日志中看到的那样对后端进行并行调用,但是这个 api 有点阻塞。

所以我只发布了需要的 api,我正在 jenkins-url/script 尝试另一种方式来进行并行异步/非阻塞调用。

标签: multithreadingjenkinsfuturejenkins-groovy

解决方案


推荐阅读