不确定这个问题是否有意义,但这就是我所观察到的。我的 Azure 函数使用 BlobTrigger 处理上传到 Blob 存储的 PDF 文件。一切工作正常,直到我一次上传多个 blob,在这种情况下,使用下面的代码我观察到以下内容:
-
第一个 context.getLogger() 正确记录触发该函数的每个 blob。
-
在 Azure 文件共享中,每个 PDF 文件都会正确保存。
-
在许多情况下,第二个 context.getLogger() 返回不正确的结果(来自其他文件之一),就好像变量在我的 Function 实例之间共享一样。请注意,lines[19] 对于每个 PDF 都是唯一的。
-
我后来在我的代码中注意到类似的行为,其中记录了来自错误 PDF 的数据。
编辑:需要明确的是,我知道当多个实例并行运行时,日志不会按顺序排列。然而,当我上传 10 个文件时,大多数结果都是重复的,而不是在行 [19] 中获得 10 个唯一结果,并且当基于 X 我想做 Y 时,这个问题稍后会在我的代码中恶化,并且 10 次调用中有 9 次产生垃圾数据。
主类
public class main {
@FunctionName("veninv")
@StorageAccount("Storage")
public void blob(
@BlobTrigger(
name = "blob",
dataType = "binary",
path = "veninv/{name}")
byte[] content,
@BindingName("name") String blobname,
final ExecutionContext context
) {
context.getLogger().info("BlobTrigger by: " + blobname + "(" + content.length + " bytes)");
//Writing byte[] to a file in Azure Functions file storage
File tempfile = new File (tempdir, blobname);
OutputStream os = new FileOutputStream(tempfile);
os.write(content);
os.close();
String[] lines = Pdf.getLines(tempfile);
context.getLogger().info(lines[19]);
}
}
pdf.class
public static String[] getLines(File PDF) throws Exception {
PDDocument doc = PDDocument.load(PDF);
PDFTextStripper pdfStripper = new PDFTextStripper();
String text = pdfStripper.getText(doc);
lines = text.split(System.getProperty("line.separator"));
doc.close();
return lines;
}
我不太明白这是怎么回事,所以希望得到一些帮助。
是的。 Azure 函数调用可以共享变量。我需要看到所有代码 100% 确定,但看起来像lines
对象被声明为static
并且它可以在调用之间共享。让我们尝试从static String[]
to String[]
看看问题是否消失?
Azure 函数很容易上手,很容易忘记执行环境。您的函数调用并不像看起来那样孤立。有一个父线程调用您的函数,并且许多静态变量不是“线程安全的”。静态变量代表全局状态,因此可以全局访问。此外,它不附加任何特定的对象实例。变量的“静态性”与它所在的内存空间有关,而不是与它的值有关。因此,同一个变量可以从引用它的所有类实例中访问。
附言。您已经在答案中解决了问题here https://stackoverflow.com/a/63650230/2048857通过减少并发性,但这可能会以可扩展性为代价。我建议对其进行负载测试。静态变量也很有用。许多都是线程安全的,您希望在 Azure 函数中使用它们,例如 httpClient 或 sqlClient 数据库连接!读一下第三条,here https://medium.com/@raunaknarooka/tips-and-tricks-for-azure-functions-c9db11aee3dc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)