【问题标题】:java.lang.ArrayIndexOutOfBoundsException: -40java.lang.ArrayIndexOutOfBoundsException:-40
【发布时间】:2018-07-07 23:08:55
【问题描述】:

我在反序列化二进制数据时遇到了这个奇怪的错误: 以下是我对阅读器的实现:

Schema schema = new Schema.Parser().parse(new File("src/main/avro/queue_data.avsc"));

SpecificDatumReader<QueueData> reader = new SpecificDatumReader<QueueData>(schema);

Decoder decoder = DecoderFactory.get().binaryDecoder(body, null);

QueueData queueData = reader.read(null, decoder);

架构:https://pastebin.com/GUJgzeh4 样本数据:https://pastebin.com/CUf1U3iL

当我运行它时会抛出如下异常:

java.lang.ArrayIndexOutOfBoundsException: -40
at org.apache.avro.io.parsing.Symbol$Alternative.getSymbol(Symbol.java:424)
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:116)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145)
at com.bpawan.messaging.Sender.readFromQueue(Sender.java:57)
at com.bpawan.messaging.Sender.access$000(Sender.java:15)
at com.bpawan.messaging.Sender$1.handleDelivery(Sender.java:38)
at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

很遗憾,错误消息并没有说明问题到底是什么。试了几次调试都没有成功。

数据的生产者是用php编写的。

【问题讨论】:

  • 你有什么解决方案吗,我在从 Spark sql 函数 from_avro 读取 avro 消息时也遇到了类似的错误?

标签: java rabbitmq avro


【解决方案1】:

这可能是因为您的正文包含不符合架构的布局。您的正文中有 41 个字节与架构中的字段不匹配,可能是预告片或标题或其他任何内容,您需要了解如何创建正文字节并调整架构或删除超出的字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2014-01-30
    • 2016-04-11
    • 2014-06-20
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多