Background
Java Azure functions 2, using blob storage with event grid subsription for blob create events which the function (see below) is bound to via the event trigger.
Problem
Not clear how to bind a blob (See @BlobInput
Java annotation) Input Blob Binding from Azure functions which the documentation illudes to, but not sure if possible in the Java API, unlike its C# counterpart.
When the function is invocked nothing is bound to the content
varaible using the @BlobInput
annotation, so once the line is reached where the content
variable is reached, it results in a null pointer.
The path = "{data.url}"
based on documentation allows you to access event data passed to the function. The data passed from the event is all bound to the EventSchema event
POJO also (see below for an example of an event).
The @StorageAccount("AzureWebJobsStorage")
links to the properties stored and setup by default via the functions configuration, which is correct.
Tried
Deployed azure function:
@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);
}
Example Event Grid Event
{
"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"
}
Log from running function locally (remote is same)
[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:
Falls over because of nothing is bound to content byte[]...
Alternative
Using the Azure Java SDK, but trying to stay with the semantics around Azure functions.