2017-10-06 6 views
0

私のワークフローは - 私はavscファイルを作成し、avrogencppツールを使用してC++クラスを生成し、C++アプリケーションでavroバイナリエンコードデータを作成します。Avro逆シリアル化エラー - ArrayIndexOutOfBoundsException

シナリオ2が機能しない理由を調べようとしています。

シナリオ1

test.avsc

{ 
"namespace": "com.company.project", 
"name": "Component_DeviceInfo", 
"type": "record", 
"doc": "Identifies a client device", 
"fields": [ 
    { 
     "name": "deviceId", 
     "type": [ 
      "null", 
      "string" 
     ], 
     "default": null, 
     "doc": "Multicast Data Client Device Id. Usually unique MAC address" 
    }, 
    { 
     "name": "zoneId", 
     "type": [ 
      "null", 
      "string" 
     ], 
     "default": null, 
     "doc": "Zone id where device belongs to" 
    } 
] 
} 

エンコーダ - C++

Component_DeviceInfo deviceInfo; 
    deviceInfo.deviceId.set_string("device1"); 
    deviceInfo.zoneId.set_string("zone1"); 
    std::vector <char>tele_bytes_; 
    std::auto_ptr<avro::OutputStream> out = avro::memoryOutputStream(1); 
    avro::EncoderPtr enc = avro::binaryEncoder(); 
    enc->init(*out); 
    avro::encode(*enc, deviceInfo); 
    out->flush(); 

    size_t byte_count = out->byteCount(); 
    DBG("BYTE COUNT " << byte_count); 

    std::auto_ptr<avro::InputStream> in = avro::memoryInputStream(*out); 
    avro::StreamReader reader(*in); 
    std::vector<uint8_t> row_data(byte_count); 
    reader.readBytes(&row_data[0], byte_count); 

Javaのデコーダー

@Override 
    public Object deserializeByteArr(Schema schema, final byte[] data){ 
     DatumReader<GenericRecord> genericDatumReader = new SpecificDatumReader<>(schema); 
     Decoder decoder = DecoderFactory.get().binaryDecoder(data, null); 
     try { 
      GenericRecord userData = genericDatumReader.read(null, decoder); 
      System.out.println(userData); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

シナリオ2 - 私は、スキーマ

に対応するC++ファイルを、スキーマを更新し、再生している

注動作しません

test.avsc

[ 
    { 
     "namespace": "com.company.project", 
     "name": "Component_DeviceInfo", 
     "type": "record", 
     "doc": "Identifies a client device", 
     "fields": [ 
      { 
       "name": "deviceId", 
       "type": [ 
        "null", 
        "string" 
       ], 
       "default": null, 
       "doc": "Unique MAC address" 
      }, 
      { 
       "name": "zoneId", 
       "type": [ 
        "null", 
        "string" 
       ], 
       "default": null, 
       "doc": "Zone id where Client device belongs to" 
      } 
     ] 
    }, 
    { 
     "namespace": "com.company.project", 
     "name": "Component_EventList", 
     "type": "record", 
     "doc": "Component Event list", 
     "fields": [ 
      { 
       "name": "deviceInfo", 
       "type": [ 
        "null", 
        "com.company.project.Component_DeviceInfo" 
       ], 
       "default": null, 
       "doc": "Device information such as device id and zone id" 
      } 
     ] 
    } 
] 

エンコーダC++

Component_DeviceInfo deviceInfo; 
    deviceInfo.deviceId.set_string("device1"); 
    deviceInfo.zoneId.set_string("zone1"); 

    std::vector <char>tele_bytes_; 

    Component_EventList ComponentEventList; 
    ComponentEventList.deviceInfo.set_Component_DeviceInfo(deviceInfo); 

    std::auto_ptr<avro::OutputStream> out = avro::memoryOutputStream(1); 
    avro::EncoderPtr enc = avro::binaryEncoder(); 
    enc->init(*out); 
    avro::encode(*enc, ComponentEventList); 
    out->flush(); 

    size_t byte_count = out->byteCount(); 
    DBG("BYTE COUNT " << byte_count); 

    std::auto_ptr<avro::InputStream> in = avro::memoryInputStream(*out); 
    avro::StreamReader reader(*in); 
    std::vector<uint8_t> row_data(byte_count); 
    reader.readBytes(&row_data[0], byte_count); 

出力

org.springframework.kafka.listener.ListenerExecutionFailedException: Listener method 'public void com.company.telemetry.services.consumer.TelemetryConsumerService.consume(org.apache.kafka.clients.consumer.ConsumerRecord<java.lang.String, byte[]>)' threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 7 
    at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:188) ~[spring-kafka-1.1.6.RELEASE.jar:na] 
    at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:72) ~[spring-kafka-1.1.6.RELEASE.jar:na] 
    at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:47) ~[spring-kafka-1.1.6.RELEASE.jar:na] 
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:794) [spring-kafka-1.1.6.RELEASE.jar:na] 
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:738) [spring-kafka-1.1.6.RELEASE.jar:na] 
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:570) [spring-kafka-1.1.6.RELEASE.jar:na] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_91] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_91] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91] 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 7 
    at org.apache.avro.io.parsing.Symbol$Alternative.getSymbol(Symbol.java:402) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.io.parsing.Parser.advance(Parser.java:88) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155) ~[avro-1.7.7.jar:1.7.7] 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142) ~[avro-1.7.7.jar:1.7.7] 
    at com.company.telemetry.services.serde.AvroByteArrDeserializer.deserializeByteArr(AvroByteArrDeserializer.java:32) ~[classes/:na] 
    at com.company.telemetry.services.TelemetryService.handleByteArr(TelemetryService.java:59) ~[classes/:na] 
    at com.company.telemetry.services.consumer.TelemetryConsumerService.consume(TelemetryConsumerService.java:39) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91] 
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:180) ~[spring-messaging-4.3.11.RELEASE.jar:4.3.11.RELEASE] 
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:112) ~[spring-messaging-4.3.11.RELEASE.jar:4.3.11.RELEASE] 
    at org.springframework.kafka.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:48) ~[spring-kafka-1.1.6.RELEASE.jar:na] 
    at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:174) ~[spring-kafka-1.1.6.RELEASE.jar:na] 
    ... 8 common frames omitted 

誰かが起こっていただきました私に言うことができれば、私は感謝!ありがとう!

+0

こんにちはKarthik、これを解決しましたか?どんなインプットも役に立つかもしれません。私は今同じ問題に直面しています。 – Learner

+0

はい。私の受け入れられた答え、具体的にはhttps://issues.apache.org/jira/browse/AVRO-2095 – KarthikJ

答えて

0

avscで配列の要素としてではなくDeviceInfoをインラインで定義すると、それは機能しますか?

+0

こんにちは@JohnM、はい、私はDeviceInfoインラインを定義するときに動作します! – KarthikJ

+0

しかし、問題はすべてのスキーマ定義をインラインにする余裕がないことです。この問題の原因となる手がかりは? – KarthikJ

関連する問題