Доступ к BLOB-объектам из функции Azure в сетке событий с использованием Java API - PullRequest
0 голосов
/ 02 октября 2019

Фон

Функции Java Azure 2, использующие хранилище BLOB-объектов с подпиской сетки событий для BLOB-объектов, создают события, с которыми функция (см. Ниже) связана через триггер события.

Проблема

Непонятно, как связать BLOB-объект (см. @BlobInput Java-аннотацию) Привязка входных BLOB-объектов из функций Azure, которые документация обозначает, но не уверен, если это возможно, в Java API, в отличие от его аналога в C #.

Когда функция вызывается, ничто не связывается с переменным content с использованием аннотации @BlobInput, поэтому, как только достигается строка, где достигается переменная content, это приводит к нулевому указателю.

path = "{data.url}" на основе документации позволяет получить доступ к данным события, переданным функции. Все данные, передаваемые из события, также связаны с EventSchema event POJO (пример события см. Ниже).

@StorageAccount("AzureWebJobsStorage") связывает со свойствами, сохраненными и настроенными по умолчанию через конфигурацию функций, что правильно.

Tried

Развернутая функция лазури:

@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);
}

Пример 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"
}

Журнал от запуска функции локально (удаленно то же самое)

[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.

1 Ответ

0 голосов
/ 07 октября 2019

Ваша функция почти правильная. Исходя из моего теста, значение {data.url} будет выглядеть как URL-адрес http:

https://storagetest789.blob.core.windows.net/test/test.txt

И если вы установите правильную строку подключения к хранилищу, привязка будет работать, и вы получите содержимое.

Вот мое подтверждение:

1. Код

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;

}

2. Проверьте строку подключения AzureWebJobsStorage в настройках приложения

enter image description here

Убедитесь, что это правильная строка подключения вашей целевой учетной записи хранения.

3. Загрузите новый BLOB-объект

enter image description here

Вы видите, что я получил правильный результат.

Итак, я предлагаю вам проверить настройки строки подключения. По умолчанию ваши локальные настройки теста не будут обновляться в облаке, что может вызвать эту проблему.

...