【发布时间】:2020-03-17 01:42:07
【问题描述】:
我正在使用 Avro 架构,使用 Confluent Kafka 客户端从 C# 应用程序动态生成消息到 Kafka 集群。编译时不知道数据类型,因此我使用来自Avro.Generic 命名空间的 GenericRecord 类,如下所述:https://www.confluent.io/blog/decoupling-systems-with-apache-kafka-schema-registry-and-avro/。
但是我有一个问题 - 如果架构有一个可以包含 null 值的字段,仍然需要使用 Add 方法将该字段添加到 GenericRecord,并将 null 作为值。我的应用程序不知道可以为空的字段,我认为不应该是 - 因为这会违背架构中可空字段的目的。
Avro 架构:
{
"namespace": "Test",
"type": "record",
"doc": "Test bool type",
"name": "BoolType",
"version": "1",
"fields": [
{
"name": "Data",
"type": [ "null", "boolean" ],
"default": null
},
{
"name": "Source",
"type": "string"
}
]
}
C#代码:
var valueRecord = new GenericRecord( valueAvroSchema );
valueRecord.Add( "Data", null );
valueRecord.Add( "Source", "Test app .NET" );
var messageToSend = new Message<GenericRecord, GenericRecord>
{
Key = keyRecord,
Value = valueRecord
};
await _producer.ProduceAsync( _topicName, messageToSend );
如果行:
valueRecord.Add( "Data", null );
不存在,ProduceAsync 方法会抛出 Confluent.Kafka.ProduceException,如下面的屏幕截图所示。
有什么方法可以自动填充 GenericRecord 中可以为空的字段?如果我必须用它们的默认值填充字段,这同样适用。
是否有任何方法可以以标准方式执行此操作,或者我是否需要编写自己的代码来读取架构,以及是否有任何我的应用程序尚未设置的可空字段在最后添加它们,之前出版?
谢谢!
【问题讨论】:
标签: c# apache-kafka schema avro confluent-platform