我想产生并发送EventData
对象,这些对象在EventData.Properties词典中设置了各种应用程序特定的属性。 Properties
字典本身定义为IDictionary<string, object>
,这意味着我可以传递任何数据类型作为值。
var eventData = new EventData(bytes);
eventData.Properties["Prop1"] = // string?
eventData.Properties["Prop2"] = // int?
eventData.Properties["Prop3"] = // DateTime?
eventData.Properties["Prop4"] = // Custom?
我实际上 可以将哪些数据类型传递到Properties
词典中?显然,该数据需要以某种方式进行序列化,但是文档中没有提及任何内容。
答案 0 :(得分:0)
我尝试了一些不起作用的方法,然后通过查看异常调用堆栈找到了源代码,从而找到了更多信息。
就我而言,受支持的属性类型似乎是从AMQP协议支持的属性(记录在here中)派生的。内部AmqpMessageConverter
代码中实际上有一个很大的switch语句,基本上可以为我提供答案:
AmqpMessageConverter.TryGetAmqpObjectFromNetObject
此处总结:
int
,string
,double
等)Guid
DateTime
和DateTimeOffset
Stream
Uri
TimeSpan
byte[]
IList
IDictionary
我自己的自定义类型(POCO-“普通的旧CLR对象”)未被接受,并导致以下异常:
System.Runtime.Serialization.SerializationException: Serialization operation failed due to unsupported type EventHubsTesting.Program+Poco.
at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.TryGetAmqpObjectFromNetObject(Object netObject, MappingType mappingType, Object& amqpObject)
at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.UpdateAmqpMessageHeadersAndProperties(AmqpMessage message, String publisher, EventData eventData, Boolean copyUserProperties)
at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.EventDataToAmqpMessage(EventData eventData)
at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.EventDatasToAmqpMessage(IEnumerable`1 eventDatas, String partitionKey)
at Microsoft.Azure.EventHubs.Amqp.AmqpEventDataSender.OnSendAsync(IEnumerable`1 eventDatas, String partitionKey)
at Microsoft.Azure.EventHubs.EventDataSender.SendAsync(IEnumerable`1 eventDatas, String partitionKey)
at Microsoft.Azure.EventHubs.EventHubClient.SendAsync(IEnumerable`1 eventDatas, String partitionKey)
at EventHubsTesting.Program.Sender(CancellationTokenSource shutdownSource) in C:\EventHubsTesting\Program.cs:line 99
我假设如果要使用自定义类型,那么在将它们分配为应用程序属性之前,我需要先对其进行序列化。
答案 1 :(得分:0)
跟着克里斯的答案-AMQP标头根据AMQP类型规范-http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-types-v1.0-os.html进行序列化。
对于查看此答案的所有Java开发人员-您可以使用Apache qpid库执行编码/解码操作。可以在此处找到解码器类-https://qpid.apache.org/releases/qpid-proton-j-0.33.1/api/index.html。
EH服务与编码无关,因此通过Kafka协议进行的消费者阅读将需要手动解码AMQP标头。本机EH客户端将为您解码标头。请参阅-https://github.com/Azure/azure-event-hubs-for-kafka/issues/56。