Hello - I am trying to understand my trouble passing an Avro message through
Kafka (0.8)
>From what I see, the class tries to create an instance of the encoder but
>fails as it can not find the constructor, although it is there.
Here's the code and subsequent error. Appreciate any help!
Thank you,
Brenden
----
public class AvroProducer {
// public final String zkConnection =
"tlvwhale1:2181,tlvwhale2:2181,tlvwhale3:2181";
public final String zkConnection = "localhost:2181";
public final String brokerList = "localhost:9092, localhost:9093,
localhost:9094";
public final String topic = "cdrTopic";
public static void main(String args[]){
AvroProducer avroProducer = new AvroProducer();
try {
// avroProducer.testGenericRecord();
avroProducer.sendCDRAvroMessage();
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File
| Settings | File Templates.
}
}
private void sendCDRAvroMessage() throws IOException {
User user1 = new User();
user1.setName("Brenden");
user1.setFavoriteNumber(256);
Properties props = new Properties();
props.put("zk.connect", zkConnection);
props.put("metadata.broker.list", brokerList);
// props.put("serializer.class", "kafka.serializer.DefaultEncoder");
props.put("serializer.class",
"org.apache.avro.io.BufferedBinaryEncoder");
// props.put("serializer.class",
"org.springframework.integration.kafka.serializer.avro.AvroSpecificDatumBackedKafkaEncoder");
// props.put("serializer.class",
"org.springframework.integration.kafka.serializer.avro.AvroReflectDatumBackedKafkaEncoder");
// Producer<String, Message> producer = new Producer<String,
Message>(new ProducerConfig(props));
Producer<String, Message> producer = new Producer<String, Message>(new
ProducerConfig(props));
ByteArrayOutputStream out = new ByteArrayOutputStream();
DatumWriter<User> userDatumWriter = new
SpecificDatumWriter<User>(User.class);
// Encoder encoder = EncoderFactory.get().binaryEncoder(out, null);
// Encoder encoder = EncoderFactory.get().directBinaryEncoder(out, null);
EncoderFactory factory = new EncoderFactory().configureBufferSize(4096);
Encoder encoder = factory.directBinaryEncoder(out, null);
userDatumWriter.write(user1, encoder);
encoder.flush();
out.close();
Message message = new Message(out.toByteArray());
producer.send(new KeyedMessage<String, Message>(topic, message));
// producer.send(new KeyedMessage<String, Message>(topic, null,
message));
}
}
---
The Error stack:
...
Message(magic = 0, attributes = 0, crc = 2755187525, key = null, payload =
java.nio.HeapByteBuffer[pos=0 lim=12 cap=12])
Exception in thread "main" java.lang.NoSuchMethodException:
org.apache.avro.io.DirectBinaryEncoder.<init>(kafka.utils.VerifiableProperties)
at java.lang.Class.getConstructor0(Class.java:2810)
at java.lang.Class.getConstructor(Class.java:1718)
at kafka.utils.Utils$.createObject(Utils.scala:458)
at kafka.producer.Producer.<init>(Producer.scala:60)
at kafka.javaapi.producer.Producer.<init>(Producer.scala:25)
at
com.humca.swizzle.kafka.producer.KafkaProducer.sendAvroMessage(KafkaProducer.java:74)
at
com.humca.swizzle.kafka.producer.KafkaProducer.main(KafkaProducer.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)