Кажется, это ошибка.
При проверке исходного кода, если вы не добавите azure-core-http-okhttp
зависимость maven, он будет использовать defaultProvider
для создания экземпляра HttpClient.
public final class HttpClientProviders {
private static HttpClientProvider defaultProvider;
private static final String CANNOT_FIND_HTTP_CLIENT =
"Cannot find any HttpClient provider on the classpath - unable to create a default HttpClient instance";
static {
ServiceLoader<HttpClientProvider> serviceLoader = ServiceLoader.load(HttpClientProvider.class);
// Use the first provider found in the service loader iterator.
Iterator<HttpClientProvider> it = serviceLoader.iterator();
if (it.hasNext()) {
defaultProvider = it.next();
}
}
private HttpClientProviders() {
// no-op
}
public static HttpClient createInstance() {
if (defaultProvider == null) {
throw new IllegalStateException(CANNOT_FIND_HTTP_CLIENT);
}
return defaultProvider.createInstance();
}
}
И, по умолчанию, azure-core-http-netty
используется. В нем есть ReactorNettyClientProvider
:
public class ReactorNettyClientProvider implements HttpClientProvider {
@Override
public HttpClient createInstance() {
return new NettyAsyncHttpClientBuilder().build();
}
}
Итак, если вы не укажете httpclient, BlobServiceClient
будет использовать NettyAsyncHttpClient
. И с этим все в порядке.
Но, если azure-core-http-okhttp
добавляется вручную в зависимости, и вы не указываете httpclient в BlobServiceClientBuilder. Тогда будет использоваться OkHttpClientProvider
.
public class OkHttpClientProvider implements HttpClientProvider {
@Override
public HttpClient createInstance() {
return new OkHttpAsyncHttpClientBuilder().build();
}
}
Забавная вещь случается тогда, вы получите ту же ошибку, что и отправили. Итак, я думаю, что-то не так с реализацией OkHttpAsyncHttpClient
.
Решение
Изменить на использование azure -core-http-netty
Изменить на использование Microsoft Azure SDK клиента хранилища
Образец:
public static void main(String[] args) throws Exception {
String connectionString = "DefaultEndpointsProtocol=https;AccountName=storagetest789;AccountKey=G36mc*******j1w==;EndpointSuffix=core.windows.net";
StorageCredentials credentials = StorageCredentials.tryParseCredentials(connectionString);
// Set proxy
//OperationContext.setDefaultProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1",8888)));
CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, true);
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.getContainerReference("function");
blobContainer.createIfNotExists();
// for (ListBlobItem blobItem : blobContainer.listBlobs()) {
// System.out.println(blobItem.getUri());
// CloudBlockBlob blockBlob = new CloudBlockBlob(blobItem.getUri(), credentials);
// blockBlob.downloadToFile("d:\\test\\"+blockBlob.getName());
// }
for (ListBlobItem blobItem : blobContainer.listBlobs()) {
String[] parts = blobItem.getUri().toString().split("/");
CloudBlockBlob blockBlob = blobContainer.getBlockBlobReference(parts[parts.length - 1]);
blockBlob.downloadToFile("d:/test/" + blockBlob.getName());
}
}