从 Azure Function 访问 Azure 存储 Blob 时,我遇到了一个奇怪的问题。我有一个用 Java 编写的函数,它应该从 Blob 下载一些数据,然后执行 PowerShell 命令。 PowerShell 命令可以启动另一个访问同一个 Blob 的 Java 应用程序。我有这个过程,除了函数首先下载 Blob 的地方,它在尝试获取大小时总是会超时。
奇怪的是,由 PowerShell 命令启动的 Java 应用程序使用相同的代码来下载 Blob,并且可以毫无问题地完成此操作。
以下是相关代码片段:
try {
blob = new BlobClientBuilder().endpoint(connStr).buildClient();
int dataSize = (int) blob.getProperties().getBlobSize(); // <- timeout occurs here
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(dataSize);
blob.download(outputStream);
outputStream.close();
String result = new String(outputStream.toByteArray(), "UTF-8");
return JsonParser.parseString(result).getAsJsonObject();
}
catch(Exception e) {
System.out.println("ERROR: "+e.getMessage());
e.printStackTrace();
return null;
}
一些相关信息:
Blob 非常小 - 只有几 KB。
两种情况都使用相同的连接字符串。
Blob 不是函数的触发器,而是为其存储数据。
编辑
使用 Log Analytics 工作区获得更好的日志后,我发现超时是由 NoSuchMethodError 引起的。
java.lang.NoSuchMethodError: io.netty.handler.ssl.SslProvider.isAlpnSupported(Lio/netty/handler/ssl/SslProvider;)Z
当我使用错误版本的 netty-all-x.x.xFINAL.jar 时,我曾见过此错误。已经在我用代码上传的 jar 中修复了这个问题,我现在想知道函数从哪里获取除了我包含的库之外的库。
最佳答案
根据编辑中提到的异常,我找到了这个线程: https://github.com/Azure/azure-functions-java-worker/issues/381 .
问题在于,Function App 本身的依赖项是在我的代码的依赖项之前加载的,并且它们之间存在冲突,如下所述:https://github.com/Azure/azure-functions-java-worker/issues/365 .
解决方案是在 Function App 的配置设置中设置 FUNCTIONS_WORKER_JAVA_LOAD_APP_LIBS = 1。
关于java - 访问 Blob 时 Azure Function 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63361138/