multithreading - 如何在 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 在 jenkins pipleline 中不起作用
- 我没有尝试 Gpars,但我尝试了 Jenkins 并行阶段,我可以存储带有回调的地图,然后说“并行地图”以并行执行,然后所有后端任务并行启动 API 以使用 multipart 上传文件,正如我在代码中提到的,有点不是并行工作,因为 1 个请求需要 2 分钟,然后 3 个请求需要 6 分钟,4 个请求需要 8 分钟,依此类推。
- 我没有尝试 Gprs,因为我尝试了 jenkins parallel,它能够像我在日志中看到的那样对后端进行并行调用,但是这个 api 有点阻塞。
所以我只发布了需要的 api,我正在 jenkins-url/script 尝试另一种方式来进行并行异步/非阻塞调用。
解决方案
推荐阅读
- r - 在名称结尾缺失的数据框中使用美元符号
- javascript - 发布成功后捕获发布请求的响应
- c# - Appium桌面应用程序测试抛出元素无法定位异常,但在测试运行之前启动应用程序时通过
- wordpress - 寻找产品保证登记表(Wordpress 插件)
- javascript - 在给定方法内的所有承诺解决后执行方法
- python - 在这种情况下,语法 [] 是什么意思?
- python - 为什么“id”和“is”在 Python 方法与静态方法中的行为不同?
- python - Tkinter Combobox 接受数组作为值
- java - 测试 apache poi 生成 excel 内容
- ios - 从 AppDelegate(来自 Universal Link)打开的视图控制器没有导航控制器