背景
Java Azure函数2,使用具有事件网格子对象的blob存储来为blob创建事件(该函数通过事件触发器绑定到该事件)。
问题
不清楚如何绑定blob (请参阅@BlobInput
Java注释)从documentation所隐含的Azure函数中输入Blob绑定,但不确定是否可以Java API,与C#对应语言不同。
调用该函数时,使用content
注释没有任何内容绑定到@BlobInput
变量,因此一旦到达content
变量所在的行,则结果为null指针。
基于文档的path = "{data.url}"
允许您访问传递给函数的事件数据。从事件传递的数据也都绑定到EventSchema event
POJO(请参阅下面的事件示例)。
@StorageAccount("AzureWebJobsStorage")
链接到默认情况下通过功能配置存储和设置的属性,这是正确的。
尝试
已部署的天蓝色函数:
@StorageAccount("AzureWebJobsStorage")
@FunctionName("myfunc")
public void run(@EventGridTrigger(name = "blobeventgrid") EventSchema event,
@BlobInput(name = "zipfile",dataType = "binary",path = "{data.url}") byte[] content,
final ExecutionContext context) {
context.getLogger().info("Java Event Grid trigger function executed.");
context.getLogger().info("Id: " + event.id);
context.getLogger().info("Data: " + event.data);
context.getLogger().info("zip file: " + content.length);
}
示例事件网格事件
{
"topic": "/subscriptions/<omitted>/resourceGroups/java-functions-group/providers/Microsoft.Storage/storageAccounts/<omitted storageaccount>",
"subject": "/blobServices/default/containers/mycontainer/blobs/compressed.zip",
"eventType": "Microsoft.Storage.BlobCreated",
"eventTime": "2019-10-02T12:46:33.2915427Z",
"id": "<omitted>",
"data": {
"api": "PutBlob",
"clientRequestId": "<omitted>",
"requestId": "<omitted>",
"eTag": "<omitted>",
"contentType": "application/zip",
"contentLength": 32460,
"blobType": "BlockBlob",
"url": "https://<omitted storageaccount>.blob.core.windows.net/mycontainer/compressed.zip",
"sequencer": "<omitted>",
"storageDiagnostics": {
"batchId": "<omitted>"
}
},
"dataVersion": "",
"metadataVersion": "1"
}
从本地运行功能登录 (远程相同)
[10/05/2019 18:48:16] Executing HTTP request: {
[10/05/2019 18:48:16] "requestId": "299a3870-98cf-41cf-b418-7cdb33c1f1c7",
[10/05/2019 18:48:16] "method": "POST",
[10/05/2019 18:48:16] "uri": "/runtime/webhooks/EventGrid"
[10/05/2019 18:48:16] }
[10/05/2019 18:48:17] Executing 'Functions.myFunc' (Reason='EventGrid trigger fired at 2019-10-05T19:48:17.4343990+01:00', Id=82a2f47b-34bc-492f-8b60-12601beb45ee)
[10/05/2019 18:48:18] Java Event Grid trigger function executed.
[10/05/2019 18:48:18] Event content
[10/05/2019 18:48:18] Subject: /blobServices/default/containers/mycontainer/blobs/zip/compressed.zip
[10/05/2019 18:48:18] Time: Mon Sep 30 20:46:33 BST 2019
[10/05/2019 18:48:18] Id: 7de5edc4-c01e-0107-1bc7-77755f061e49
[10/05/2019 18:48:18] Data: {api=PutBlob, clientRequestId=007dd554-e3bb-11e9-80b4-dca90473b192, requestId=7de5edc4-c01e-0107-1bc7-77755f000000, eTag=0x8D745DEE5936EE3, contentType=application/zip, contentLength=32460.0, blobType=BlockBlob, url=https://<ommitted storage account>.blob.core.windows.net/mycontainer/zip/compressed.zip, sequencer=000000000000000000000000000007E200000000002ab872, storageDiagnostics={batchId=1c15a3b6-2006-0046-00c7-771b19000000}}
[10/05/2019 18:48:18] Executed 'Functions.myFunc' (Failed, Id=82a2f47b-34bc-492f-8b60-12601beb45ee)
[10/05/2019 18:48:18] System.Private.CoreLib: Exception while executing function: Functions.myFunc. System.Private.CoreLib: Result: Failure
[10/05/2019 18:48:18] Exception: NullPointerException:
无所作为而失败,绑定到内容字节[] ...
替代
使用Azure Java SDK,但尝试保持与Azure函数有关的语义。
答案 0 :(得分:0)
您的功能几乎正确。根据我的测试,{data.url}
的值应为http网址,如下所示:
https://storagetest789.blob.core.windows.net/test/test.txt
如果您设置了正确的存储连接字符串,绑定将起作用并且您将获得内容。
这是我的验证:
public class Function {
@FunctionName("StroageEventGrid")
@StorageAccount("AzureWebJobsStorage")
public void run(@EventGridTrigger(name = "blobeventgrid") EventSchema event,
@BlobInput(name = "blob",dataType = "binary",path = "{data.url}") byte[] content,
final ExecutionContext context)
{
context.getLogger().info((String)event.data.get("url"));
if(content != null)
context.getLogger().info("Length: " + content.length);
else
context.getLogger().info("Content is null");
}
}
public class EventSchema {
public String topic;
public String subject;
public String eventType;
public Date eventTime;
public String id;
public String dataVersion;
public String metadataVersion;
public Map<String, Object> data;
}
确保它是目标存储帐户的正确连接字符串。
您可以看到我得到了正确的结果。
因此,建议您检查连接字符串设置。默认情况下,您的本地测试设置不会更新到云,这可能会导致此问题。