问题描述
我有一个通过azure-functions-java-library实现的Azure函数,该函数从一个EventHub接收事件,而我正在使用@EventHubTrigger,问题是我需要来自事件的标头数据,但看不到任何实现此目的的方式,我已经阅读了文档,什么也没有。我需要这个的原因是因为我从EventHub接收具有不同Avro模式的事件,所以我需要区分它们以便对其进行解析。
非常感谢您的帮助。
解决方法
是的,例如,您可以通过向方法参数中添加@BindingName("Properties")
批注来检索消息元数据,例如如下所示。这里需要注意的事情是,您可以使用binding expression绑定到事件的任何元数据。在这种情况下,它就是“属性”。另外,基数应为ONE。
@FunctionName("EventHubExample")
public void logEventHubMessage(
@EventHubTrigger(name = "message",eventHubName = "test",connection = "AzureEventHubConnection",consumerGroup = "$Default",cardinality = Cardinality.ONE,dataType = "string")
String message,final ExecutionContext context,@BindingName("Properties")
Map<String,Object> properties) {
context.getLogger().info("Event hub message received: " + message + ",properties: " + properties);
}
我使用Service Bus Explorer作为Event Sender来设置事件的元数据,如下所示,并且能够使用上述“属性”绑定中的代码在消费者端看到这些元数据。
C#函数SDK比Java具有优势。在C#中,您可以获得整个Event对象,当在输入中获取多个事件时,可以更轻松地直接导航元数据。但是不幸的是,到目前为止,在Java SDK中这是不可能的,您必须使用单个基数分别进行绑定。