Почему приложение Java Azure Function зависает при попытке доступа к данным Azure?

Я разрабатываю функцию Java Azure, которой необходимо загрузить файл из Azure Datalake Gen2.
Когда функция пытается прочитать файл, он зависает, исключение не создается, и в консоль ничего не записывается.

Я использую SDK azure-storage-file-datalake для зависимости от Java, и это мой код:

import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.storage.file.datalake.DataLakeDirectoryClient;
import com.azure.storage.file.datalake.DataLakeFileClient;
import com.azure.storage.file.datalake.DataLakeFileSystemClient;
import com.azure.storage.file.datalake.DataLakeServiceClient;
import com.azure.storage.file.datalake.DataLakeServiceClientBuilder;

public DataLakeServiceClient GetDataLakeServiceClient(String accountName, String accountKey)
{
    StorageSharedKeyCredential sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
    DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();
    builder.endpoint("https://" + accountName + ".dfs.core.windows.net");
    builder.credential(sharedKeyCredential);
    return builder.buildClient();
}

public void DownloadFile(DataLakeFileSystemClient fileSystemClient, String fileName) throws Exception{

    DataLakeDirectoryClient directoryClient = fileSystemClient.getDirectoryClient("DIR");
    DataLakeDirectoryClient subdirClient= directoryClient.getSubdirectoryClient("SUBDIR");
    DataLakeFileClient fileClient = subdirClient.getFileClient(fileName);

    File file = new File("downloadedFile.txt");
    OutputStream targetStream = new FileOutputStream(file);
    fileClient.read(targetStream);
    targetStream.close();
}

@FunctionName("func")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS)
        HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context
    )
{
    String fileName= request.getQueryParameters().get("file");

    DataLakeServiceClient datalakeClient= GetDataLakeServiceClient("datalake", "<the shared key>");
    DataLakeFileSystemClient datalakeFsClient= datalakeClient.getFileSystemClient("fs");

    DownloadFile(datalakeFsClient, fileName);

}   

Приложение зависает при обнаружении fileClient.read (targetStream);
Я пробовал с очень маленькими файлами, я проверил учетные данные и пути к файлам, права доступа к datalake, я переключился на токен SAS - результат тот же: никакой ошибки, но приложение зависает.

Я использую эти зависимости Maven:

<dependency>
    <groupId>com.microsoft.azure.functions</groupId>
    <artifactId>azure-functions-java-library</artifactId>
</dependency>

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-file-datalake</artifactId>
    <version>12.2.0</version>
</dependency>

person Alex Serban    schedule 14.10.2020    source источник
comment
Я воспроизвел вашу проблему и тоже завис в fileClient.read(targetStream);, но я запускаю ваш код в основном методе , это сработало.   -  person Frank Gong    schedule 19.10.2020
comment
Привет! К сожалению, мне нужно разработать функцию Azure, поэтому у меня нет основного метода ...   -  person Alex Serban    schedule 20.10.2020
comment
Если вы найдете решение, дайте мне знать, я тоже хочу знать.   -  person Frank Gong    schedule 20.10.2020


Ответы (1)


так что я столкнулся с той же проблемой. Затем я столкнулся с этим.

https://github.com/Azure/azure-functions-java-library/issues/113

Это сработало для меня на java 8, azure function v3.

Установите для FUNCTIONS_WORKER_JAVA_LOAD_APP_LIBS значение True в настройках приложения-функции. Затем сохраните и перезапустите приложение-функцию. Оно будет работать.

Пожалуйста, проверьте и обновите, если это сработало и для вас.

person sand87    schedule 03.11.2020