package backtype.storm.serialization; import backtype.storm.task.GeneralTopologyContext; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.TupleExt; import com.esotericsoftware.kryo.io.Output; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Map; public class KryoTupleSerializer implements ITupleSerializer { KryoValuesSerializer _kryo; SerializationFactory.IdDictionary _ids; Output _kryoOut; public KryoTupleSerializer(final Map conf, final GeneralTopologyContext context) { _kryo = new KryoValuesSerializer(conf); _kryoOut = new Output(2000, 2000000000); _ids = new SerializationFactory.IdDictionary(context.getRawTopology()); } /** * @@@ in the furture, it will skill serialize 'targetTask' through check * some flag * @see backtype.storm.serialization.ITupleSerializer#serialize(int, * backtype.storm.tuple.Tuple) */ public byte[] serialize(Tuple tuple) { try { _kryoOut.clear(); if (tuple instanceof TupleExt) { _kryoOut.writeInt(((TupleExt) tuple).getTargetTaskId()); } _kryoOut.writeInt(tuple.getSourceTask(), true); _kryoOut.writeInt( _ids.getStreamId(tuple.getSourceComponent(), tuple.getSourceStreamId()), true); tuple.getMessageId().serialize(_kryoOut); _kryo.serializeInto(tuple.getValues(), _kryoOut); return _kryoOut.toBytes(); } catch (IOException e) { throw new RuntimeException(e); } } public static byte[] serialize(int targetTask) { ByteBuffer buff = ByteBuffer.allocate((Integer.SIZE / 8)); buff.putInt(targetTask); byte[] rtn = buff.array(); return rtn; } // public long crc32(Tuple tuple) { // try { // CRC32OutputStream hasher = new CRC32OutputStream(); // _kryo.serializeInto(tuple.getValues(), hasher); // return hasher.getValue(); // } catch (IOException e) { // throw new RuntimeException(e); // } // } }