我有 2 个应用程序,一个正在生成主题数据,另一个应用程序从主题接收数据。作家模式版本不同于读者(消费者)模式。生产者拥有新架构,而消费者拥有旧架构。使用模式注册表模式演变选项,我认为消费者可以成功工作,但我遇到了错误。看起来消费者正在查看特定记录中接收到的字段的顺序,而不是忽略未知字段。
来自 Avro 文档:
如果两者都是记录:
- 字段的顺序可能不同:字段按名称匹配。
- 两个记录中具有相同名称的字段的模式是递归解析的。
- 如果作者的记录包含一个名称不存在于读者记录中的字段,则忽略该字段的作者值。
Caused by: java.lang.IndexOutOfBoundsException: Invalid index: 2
at com.test.Employee.put(Employee.java:111) ~[classes!/:0.0.1-SNAPSHOT]
at org.apache.avro.generic.GenericData.setField(GenericData.java:816) ~[avro-1.9.2.jar!/:1.9.2]
at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:139) ~[avro-1.9.2.jar!/:1.9.2]
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:247) ~[avro-1.9.2.jar!/:1.9.2]
at org.apache.avro.specific.SpecificDatumReader.readRecord(SpecificDatumReader.java:123) ~[avro-1.9.2.jar!/:1.9.2]
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179) ~[avro-1.9.2.jar!/:1.9.2]
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:160) ~[avro-1.9.2.jar!/:1.9.2]
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153) ~[avro-1.9.2.jar!/:1.9.2]
生产者模式:
{
"type": "record",
"namespace": "com.aa.opshub.test",
"name": "Employee",
"fields": [
{
"name": "firstName",
"type": "string"
},
{
"name": "age",
"type": "int"
},
{
"name": "middleName",
"type": "string"
}
]
}
消费者模式:
{
"type" : "record",
"namespace" : "com.aa.opshub.test",
"name" : "Employee",
"fields" : [
{ "name" : "firstName" , "type" : "string" },
{ "name" : "age", "type" : "int" }
]
}
消费者:SpecificRecord 类方法抛出错误
@SuppressWarnings(value="unchecked")
public void put(int field$, java.lang.Object value$) {
switch (field$) {
case 0: firstName = (java.lang.CharSequence)value$; break;
case 1: age = (java.lang.Integer)value$; break;
default: throw new IndexOutOfBoundsException("Invalid index: " + field$);
}
}