java - 竞争条件,较小的请求优先于较大的 Java 8 异步
问题描述
我为函数 getArtifactDataList() 提供了一个基本 url,然后我得到了一个包含 2 个 InputStream 的列表。InputStreams 的大小应该不同,因为它们是我下载的非常不同的工件。然而它们是一样的。
代码:
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.16</version> </dependency>
import org.apache.commons.io.IOUtils;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
private static final String DOWNLOAD_1 = "http://some.random/host/artifact.zip";
private static final String DOWNLOAD_2 = "http://random.other/host/artifact2.zip"
public static void main(String[] args) throws Exception {
List<InputStream> artifactData = getArtifactDataList();
for(InputStream is : artifactData) {
System.out.println("Size: "+ IOUtils.toByteArray(is).length);
}
}
public static final List<InputStream> getArtifactDataList() throws Exception {
List<InputStream> listData = new ArrayList<>();
URL downloadUrl = UriBuilder.fromUri(DOWNLOAD_1).buildFromMap(new HashMap<>()).toURL();
final InputStream data = requestData(downloadUrl); // should be 20MB in size
URL downloadFontsUrl = UriBuilder.fromUri(DOWNLOAD_2).buildFromMap(new HashMap<>()).toURL();
final InputStream fontsData = requestData(downloadFontsUrl); // should be 1MB in size
listData.add(fontsData);
listData.add(data);
return listData;
}
public static final InputStream requestData(URL url) {
Client c = ClientBuilder.newClient();
WebTarget resource = c.target(url.toString());
Invocation.Builder request = resource.request();
request.accept(MediaType.APPLICATION_XML);
final InputStream data =
request.get().readEntity(InputStream.class);
return data;
}
输出
大小:1MB
大小:1MB
似乎 2 个请求中较小的一个(fontsData)以某种方式覆盖了较大的 2 个。我几乎不知道发生了什么。似乎是一个竞争条件,但我不想同步 requestData 函数。是否有其他一些非常简单易用的解决方案?也许是 Java 期货或承诺?在我的情况下如何使用?谁能告诉我这里到底发生了什么?如何解决这个问题?
编辑:此代码旨在说明我的问题。我将流添加到列表中。还添加了网址生成器(我认为这无关紧要)
工作示例
解决方案
推荐阅读
- android - 在我的项目 Glide 库中不加载图像
- algorithm - T(n) = T(n/10) + T(an) + n,怎么解决?
- python - eli5 show_prediction 仅显示特征权重而不显示示例预测
- font-awesome - 出于某种原因,我无法更改 fontawesome 图标颜色
- excel - 无法通过变量激活工作簿
- python - 应该使用哪种类型的 NN 学习来构建具有 NN-finetuning 的控制器?它可以用 keras 创建吗?
- gcc - GCC:在使用 -O2 和 -O3 的某些情况下,__builtin_ctz 的编译时评估错误
- node.js - 如何使用猫鼬一起搜索多个查询?
- go - Golang 从 mongo ISODate 解析日期时间
- python - python中“get_all_members()”函数的Discord Bot问题