Я снабжаю функцию getArtifactDataList () базовым URL и получаю список из 2 InputStreams.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 фьючерсы или обещания?Как использовать в моем случае?Кто-нибудь может сказать мне, что здесь действительно происходит?Как это исправить?
Редактировать: Этот код предназначен для иллюстрации моей проблемы.Я добавил потоки в список.Также добавлен построитель URL (я не думаю, что это актуально)
рабочий пример