As some of you may know, I’ve been writing a bit of Java in Boulder recently. Overall, it’s pretty exciting and a nice change from Ruby.
That being said, I’ve somewhat isolated our Java development to server-side components. I still consider Ruby/Rails to be the best solution for web application development, although recently had a need for Java.
Anyway, I’ve been playing around with Avro and I thought I’d share a small example that marshals a domain object to bytes. The bytes are later passed around several queues within application.
package com.barinek.devourer.avro;
import com.barinek.devourer.rest.resources.Activity;
import org.apache.avro.Schema;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.reflect.ReflectData;
import org.apache.avro.reflect.ReflectDatumWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ReflectMarshaller {
private final Schema schema = ReflectData.get().getSchema(Activity.class);
public byte[] marshal(Activity activity) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ReflectDatumWriter< Activity > reflectDatumWriter = new ReflectDatumWriter< Activity >(schema);
DataFileWriter< Activity > writer = new DataFileWriter< Activity >(reflectDatumWriter).create(schema, outputStream);
writer.append(activity);
writer.close();
return outputStream.toByteArray();
}
}
The interesting bit is that I don’t have a .proto file or .json representation of the type. The Activity class is a Plain Old Java Object.
The above snippet is a candidate to replace some proto files, assuming the MicroBenchmark test suite passes.
Look for more Java posts in the near future.
Here’s an update with unmarshal and T params.
package com.barinek.devourer.avro;
import org.apache.avro.Schema;
import org.apache.avro.file.DataFileStream;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.reflect.ReflectData;
import org.apache.avro.reflect.ReflectDatumReader;
import org.apache.avro.reflect.ReflectDatumWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ReflectMarshaller {
public byte[] marshal(Object activity) throws IOException {
Schema schema = ReflectData.get().getSchema(activity.getClass());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ReflectDatumWriter< Object > reflectDatumWriter = new ReflectDatumWriter< Object >(schema);
DataFileWriter< Object > writer = new DataFileWriter< Object >(reflectDatumWriter).create(schema, outputStream);
writer.append(activity);
writer.close();
return outputStream.toByteArray();
}
public < T > T unmarshal(Class< T > returnType, byte[] bytes) throws IOException {
Schema schema = ReflectData.get().getSchema(returnType);
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
ReflectDatumReader< T > reflectDatumReader = new ReflectDatumReader< T >(schema);
DataFileStream< T > reader = new DataFileStream< T >(inputStream, reflectDatumReader);
Object activity = reader.next();
reader.close();
inputStream.close();
return ( T ) activity;
}
}