0

我有 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" }
    ]
}

消费者: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$);
    }
  }
4

0 回答 0