我有一个iot-hub,它接收JSON和非json(十六进制)消息。这些都会转到我的Java函数应用程序来解码。基于device-id,我调用了一个不同的解码器。
我正在尝试获取我正在接收的消息的实际iothub-connection-device-id。
public class TranslateEndpoint {
/**
* This function will be invoked when an event is received from Event Hub.
*/
@FunctionName("TranslateEndpoint")
public void run(
@EventHubTrigger(name = "message", eventHubName = "NAME-DeviceIntegration", connection = "HostName=HOST;SharedAccessKeyName=NAME;SharedAccessKey=KEY=", consumerGroup = "$Default", cardinality = Cardinality.ONE) EventData message,
final ExecutionContext context
) {
context.getLogger().info("Java Event Hub trigger function executed.");
context.getLogger().info("Length:" + message.toString());
TranslateController temp = new TranslateController();
// Build up a list with all the data
context.getLogger().info(message.getSystemProperties().getPublisher());
context.getLogger().info(message.getSystemProperties().getPartitionKey());
context.getLogger().info(message.getSystemProperties().get("iothub-connection-device-id").toString());
}上面的代码是受我发现的一些C#代码的启发。不幸的是,我得到了一个错误Stack: java.lang.RuntimeException: Unable to invoke no-args constructor for interface com.microsoft.azure.eventhubs.EventData. Registering an InstanceCreator with Gson for this type may fix this problem.
在我使用String并且只得到我的实际有效载荷之前。接收我的邮件的系统属性的正确方式是什么?
发布于 2019-05-11 21:34:26
至少在Java中,元数据属性必须通过附加的带注释的参数来提取,在这种情况下:
//The system properties, including the event data
@BindingName("SystemProperties") Map<String, Object> systemProperties然后可以从该参数检索设备ID:
String deviceId = (String) systemProperties.get("iothub-connection-device-id");带有@EventHubTrigger注释的@EventHubTrigger参数应该是一个字符串,或者可能是一个字节数组。在这种情况下,POJO (或EventData )不能映射,因为备份数据只包含事件有效负载/值。
因此,函数应该如下所示:
public class TranslateEndpoint {
/**
* This function will be invoked when an event is received from Event Hub.
*/
@FunctionName("TranslateEndpoint")
public void run(
@BindingName("SystemProperties") Map<String, Object> systemProperties,
@EventHubTrigger(name = "message", eventHubName = "NAME-DeviceIntegration", connection = "HostName=HOST;SharedAccessKeyName=NAME;SharedAccessKey=KEY=", consumerGroup = "$Default", cardinality = Cardinality.ONE) String message,
final ExecutionContext context
) {
String deviceId = (String) systemProperties.get("iothub-connection-device-id");
//decode/parse message string
//...
}
}文档:
我不得不说,文档可以不那么麻烦,就像所有支持的语言中的API可能更加一致一样。我可能还漏掉了什么。
https://stackoverflow.com/questions/55909511
复制相似问题