首页 > 解决方案 > 如何将随机字符串添加到 Azure Function Blob 输出文件名?- 指定的阻止列表无效

问题描述

当以非快速循环调用 java 函数时,我的 Blob 输出工作成功。但是在快速循环中调用函数时会出错。由于 Java 不支持持久单例,我只需要让每个文件都有唯一的名称。

如何在名称中添加随机字符串或 guid,以便每个文件都获得唯一的名称,即使时间戳相同。

错误:

system.Private.CoreLib: Exception while executing function: Functions.TopicTriggerDatalakeOutput. 
Microsoft.Azure.WebJobs.Host: Error while handling parameter _binder after function returned:. 
Microsoft.WindowsAzure.Storage: The specified block list is invalid.

代码:

@BlobOutput(
         name = "target", 
        connection = "DataLakeConnString",
        path = "profile/blob_{DateTime}.csv")
        OutputBinding<String> outputItem,

标签: azure-functions

解决方案


基于 Java 的 Azure Function 声明部分中提供的 blob 名称必须是常量,因此如果要直接在绑定中为 blob 添加随机 GUID,这是不可能的。

但是你的想法还是可以实现的,只要把逻辑放到函数里面,就像这样:

String connectStr = "DefaultEndpointsProtocol=https;AccountName=0730bowmanwindow;AccountKey=xxx;EndpointSuffix=core.windows.net";
String containerName = "yourcontainername";
String fileName = "yourblobprefix" + java.util.UUID.randomUUID() + ".txt";
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient();
BlobContainerClient containerClient = blobServiceClient.createBlobContainer(containerName);
BlobClient blobClient = containerClient.getBlobClient(fileName);
long streamlong = request.getBody().get().length();
String st = request.getBody().get();
InputStream inputstream = new ByteArrayInputStream(st.getBytes());
blobClient.upload(inputstream, streamlong, true);

你可以看看这个文档。它告诉您如何上传 blob,它基于 java v12 sdk。是关于 java sdk v8 的。


推荐阅读