Avro 架构反序列化索引越界异常错误 - 架构解析

时间:2021-06-07 16:38:11

标签: java avro confluent-schema-registry avro-tools

我有 2 个应用程序,一个是将数据生成到主题,另一个应用程序从主题接收数据。写入器模式版本不同于读取器(消费者)模式。生产者有新模式,而消费者有旧模式。使用架构注册表架构演变选项,我认为消费者可以成功运行,但我遇到了以下错误。看起来消费者在查看特定记录中接收字段的顺序,而不是忽略未知字段。

来自 Avro 文档:

<块引用>

如果两者都是记录:

  1. 字段的顺序可能不同:字段由 名字。
  2. 两个记录中具有相同名称的字段的架构是 递归解决。
  3. 如果作者的记录中包含的字段名称不存在于读者的记录中,则作者对该字段的值将被忽略。
 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" }
    ]
}

Consumer: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$);
    }
  }

0 个答案:

没有答案