package org.act.tstream.message.zeroMq; import java.nio.ByteBuffer; import backtype.storm.serialization.KryoTupleDeserializer; /** * virtualport send message * * @author yannian/Longda * */ public class PacketPair { private int port; private byte[] message; public PacketPair(int port, byte[] message) { this.port = port; this.message = message; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public byte[] getMessage() { return message; } public void setMessage(byte[] message) { this.message = message; } public static byte[] mk_packet(int virtual_port, byte[] message) { ByteBuffer buff = ByteBuffer.allocate((Integer.SIZE / 8) + message.length); buff.putInt(virtual_port); buff.put(message); byte[] rtn = buff.array(); return rtn; } public static PacketPair parse_packet(byte[] packet) { ByteBuffer buff = ByteBuffer.wrap(packet); int port = buff.getInt(); /** * @@@ Attention please, in order to reduce memory copy * * Here directly PacketPair.message use the packet buffer * * so need get rid of the target target taskid in * KryoTupleDeserializer.deserialize * * * The better design should tuple includes targetTaskId */ byte[] message = null; if (KryoTupleDeserializer.USE_RAW_PACKET == true) { message = packet; } else { message = new byte[buff.array().length - (Integer.SIZE / 8)]; buff.get(message); } PacketPair pair = new PacketPair(port, message); return pair; } }