背景
Java Azure 函数 2,将 Blob 存储与 blob 的事件网格子序列结合使用,创建函数(见下文)通过事件触发器绑定到的事件。
问题
不清楚如何从Azure函数绑定blob(请参见< code > @ Blob Input Java annotation)输入Blob绑定,该文档说明了这些函数,但不确定在Java API中是否可能,这与C#中的情况不同。
当函数被调用时,使用@BlobInput
注释,没有任何内容绑定到content
varaible,因此一旦到达content
变量所在的行,它会导致一个空指针。
基于留档的path="{data.url}"
允许您访问传递给函数的事件数据。从事件传递的数据也全部绑定到EventSchema事件
POJO(有关事件的示例,请参阅下面)。
< code > @ storage account(" azurewebjobstorage ")链接到默认情况下通过函数配置存储和设置的属性,这是正确的。
试
已部署的 azure 函数:
@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:
因为什么都没有绑定到内容字节[]...
可供替代的
使用AzureJavaSDK,但尝试保持Azure功能的语义学。
你的功能几乎是正确的。根据我的测试,< code>{data.url}的值将是一个http url,如下所示:
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;
}
确保它是目标存储帐户的正确连接字符串。
你可以看到我得到了正确的结果。
所以,我建议您检查您的连接字符串设置。默认情况下,您的本地测试设置不会更新到云,这可能会导致此问题。
我正在尝试设置一个 Powershell Azure 函数,该函数在 Blob 存储容器中创建文件时触发。该函数需要处理 Blob 文件并将其保存到其他 Blob 存储容器。 目前这个函数什么都不做,因为我正在尝试处理下面的问题。 我无法从 powershell 函数内部访问 blob。我能够使用属性在c#中实现这一点,但似乎Powershell不支持属性。 我尝试在函数的集成选项卡下添加Azur
我已经实现了一个EventGrid触发器来响应Blob存储事件,其逻辑简化如下: 外部API的响应时间不长(1秒或更短),我对主机的配置设置为默认(因此允许无限数量的并发调用)。 当同时添加多个blob(从只有2个blob开始)时,我在日志中得到了很多重复的事件(脚本正在快速地一个接一个地上传blob,中间没有等待时间)。 我觉得这可能是由于我从不承认收到事件,我不知道我是否应该在我的代码中执行此
我们有一个 Azure 设置,其中包含一个 Azure 事件网格主题,并且我们有一个 Azure 函数服务,其中包含大约 15 个函数,这些函数通过不同的前缀筛选器订阅该主题。Azure 函数服务设置为基于消耗的资源,应该能够根据需要进行缩放。 每个订阅都设置为在最多4小时内尝试交付10次,然后放弃活动。到目前为止一切顺利,设置大部分时间都按预期工作。 在某些情况下,对于我们未知的情况,事件网格主
我正在使用ARM模板为我的Azure资源创建CI/CD管道。在我的Arm模板中,我使用zipdeploy来部署我的azure函数的代码。 基本上,我需要指定包Uri,它需要通过互联网访问。 在我的 Azure 管道中,我正在创建函数的 zip 包,并使用 dotnet 发布发布到 Azure 管道项目,然后我获取 URL:https://dev.azure.com/ifolor/_apis/res
在Azure function中,你可以创建一个函数来监听某个事件的变化,比如消息总线、blob存储等等... 如果您正在使用azure功能,并且您的目标是通过侦听事件(如消息总线、blob存储或任何其他内置触发器)来处理某些事情,那么您有什么理由希望将事件网格放在中间层吗?即,您不希望azure函数直接侦听blob存储更改,而是希望azure函数侦听正在侦听blob存储器更改事件的事件网格。 谢
我的Azure Functions事件网格触发器没有触发。我是这么做的。 Key Vault设置为将事件报告给EventGrid系统主题 此主题由将事件传递到Azure Function的订阅订阅 函数有一个事件网格触发器(见下文,默认由门户创建): 我用谷歌搜索了一下,对于这样的入门级方案,没有更多的指导。我想的也许是授权...订阅如何触发该函数?在此过程中(通过GUI /门户配置),没有任何关