java – Avro架构不尊重向后兼容性

我有这个avro架构
{
 "namespace": "xx.xxxx.xxxxx.xxxxx","type": "record","name": "MyPayLoad","fields": [
     {"name": "filed1","type": "string"},{"name": "filed2","type": "long"},{"name": "filed3","type": "boolean"},{
          "name" : "metrics","type": 
          {
             "type" : "array","items": 
             { 
                 "name": "MyRecord","fields" : 
                     [                         
                       {"name": "min",{"name": "max",{"name": "sum",{"name": "count","type": "long"}
                     ]
             } 
          }
     }
  ]
}

这是我们用来解析数据的代码

public static final MyPayLoad parseBinaryPayload(byte[] payload) {
        DatumReader<MyPayLoad> payloadReader = new SpecificDatumReader<>(MyPayLoad.class);
        Decoder decoder = DecoderFactory.get().binaryDecoder(payload,null);
        MyPayLoad myPayLoad = null;
        try {
            myPayLoad = payloadReader.read(null,decoder);
        } catch (IOException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
        }

        return myPayLoad;
    }

现在我想在架构中添加一个字段,因此架构如下所示

{
 "namespace": "xx.xxxx.xxxxx.xxxxx","type": "long"}
                     ]
             } 
          }
     }
     {"name": "agentType","type": ["null","string"],"default": "APP_AGENT"}
  ]
}

注意添加的字段,也定义了默认值.问题是,如果我们收到使用旧架构编写的数据,我会收到此错误

java.io.EOFException: null
    at org.apache.avro.io.BinaryDecoder.ensureBounds(BinaryDecoder.java:473) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:128) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.io.BinaryDecoder.readIndex(BinaryDecoder.java:423) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:229) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.io.parsing.Parser.advance(Parser.java:88) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:206) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:177) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:148) ~[avro-1.7.4.jar:1.7.4]
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:139) ~[avro-1.7.4.jar:1.7.4]
    at com.appdynamics.blitz.shared.util.XXXXXXXXXXXXX.parseBinaryPayload(BlitzAvroSharedUtil.java:38) ~[blitz-shared.jar:na]

我从this文件中了解到这应该是向后兼容的,但不知何故情况似乎并非如此.知道我做错了什么吗?

解决方法

最后我得到了这个工作.我需要在SpecificDatumReader中给出两个模式
所以我修改了这样的解析,我在读者中传递了新旧架构,它就像一个魅力
public static final MyPayLoad parseBinaryPayload(byte[] payload) {
        DatumReader<MyPayLoad> payloadReader = new SpecificDatumReader<>(SCHEMA_V1,SCHEMA_V2);
        Decoder decoder = DecoderFactory.get().binaryDecoder(payload,e);
        }

        return myPayLoad;
    }

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...