Apache camel 通过Apache Camel使用来自Kafka的Avro消息

Apache camel 通过Apache Camel使用来自Kafka的Avro消息,apache-camel,unmarshalling,apache-kafka,Apache Camel,Unmarshalling,Apache Kafka,我有一条Apache Camel路线,将AVRO消息发布到Apache Kafka主题上。我只有在设置生产者属性“serializerClass=kafka.serializer.StringEncoder”时才能使用它。否则我会 java.lang.ClassCastException:java.lang.String不能转换为[B] 位于kafka.serializer.DefaultEncoder.toBytes(Encoder.scala:34) kafka.producer.async

我有一条Apache Camel路线,将AVRO消息发布到Apache Kafka主题上。我只有在设置生产者属性“serializerClass=kafka.serializer.StringEncoder”时才能使用它。否则我会

java.lang.ClassCastException:java.lang.String不能转换为[B] 位于kafka.serializer.DefaultEncoder.toBytes(Encoder.scala:34) kafka.producer.async.DefaultEventHandler$$anonfun$serialize$1.apply(DefaultEventHandler.scala:130) 在 kafka.producer.async.DefaultEventHandler$$anonfun$serialize$1.apply(DefaultEventHandler.scala:125) 在 scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) 在 scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:34) 在 kafka.producer.async.DefaultEventHandler.serialize(DefaultEventHandler.scala:125) 在 kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:52) 在卡夫卡。制片人。制片人。发送(制片人。斯卡拉:77)在 kafka.javaapi.producer.producer.send(producer.scala:33)在 org.apache.camel.component.kafka.KafkaProducer.process(KafkaProducer.java:84)

在另一端,我有第二个Apache Camel路由,应该从上面的主题中使用,但是失败了

java.io.IOException:在处的长编码无效 org.apache.avro.io.BinaryDecoder.innerLongDecode(BinaryDecoder.java:217) 位于org.apache.avro.io.BinaryDecoder.readLong(BinaryDecoder.java:176) 在 org.apache.avro.io.ResolvingDecoder.readLong(ResolvingDecoder.java:162) 在 org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:160) 在 org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193) 在 org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183) 在 org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) 在 org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142) 在 org.apache.camel.dataformat.avro.AvroDataFormat.unmarshal(AvroDataFormat.java:133) 在 org.apache.camel.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:67)

以下是我使用的Apache Camel消费者代码:

        <route id="cassandra.publisher">
            <from
                uri="{{kafka.base.uri}}&amp;topic=sensordata&amp;groupId=Cassandra_ConsumerGroup&amp;consumerId=CassandraConsumer_Instance_1&amp;clientId=adapter2" />      
            <unmarshal>
                <custom ref="avroSensorData" />
            </unmarshal>

描述Apache Camel版本2.16.0/2.15.3将支持各种数据类型,而不仅仅是字符串消息


正如所承诺的,这已通过Apache Camel 2.15.3修复,并通过Camel-8790()修复。

为了解决此问题,您必须为Camel kafka消费者提供keyDeserializer和valueDeserializer,如下所示:


&keyDeserializer=org.apache.kafka.common.serialization.StringDeserializer&valueDeserializer=org.apache.kafka.common.serialization.ByteArrayDeserializer

是否可以发布更少的代码,但仍然包含出现问题的位?这样可以更容易地识别问题并帮助解决问题。您能否帮助我添加t他从(“kafka:{{consumer.topic}}?brokers={{{kafka.host}}}:{{{kafka.port}}}”+“&maxPollRecords={{{consumer.maxPollRecords}}}”+”&consumersCount={{consumer.consumersCount}}}}+&seekTo={consumer.seekTo}+&groupId={{consumer.group}“+”&valueDeserializer=“+kafkaavroderializer.class+”&keyDeserializer=“+StringDeserializer.class”).routeId(“FromKafka”)