/** * Creates a Request. * @param messageName the name of the message to invoke. * @param request the request data to send. * @param context the RPC context to use. * @param encoder the BinaryEncoder to use to serialize the request. */ public Request(String messageName, Object request, RPCContext context, BinaryEncoder encoder) { this.messageName = messageName; this.request = request; this.context = context; this.encoder = ENCODER_FACTORY.binaryEncoder(new ByteBufferOutputStream(), encoder); }
public ByteBufferOutputStream() { reset(); }
/** Add a buffer to the output without copying, if possible. */ public void writeBuffer(ByteBuffer buffer) throws IOException { if (buffer.remaining() < BUFFER_SIZE) { write(buffer.array(), buffer.position(), buffer.remaining()); } else { // append w/o copying bytes ByteBuffer dup = buffer.duplicate(); dup.position(buffer.limit()); // ready for flip buffers.add(dup); } } }
/** Return the remote protocol. Force a handshake if required. */ public Protocol getRemote() throws IOException { if (remote != null) return remote; // already have it MD5 remoteHash = REMOTE_HASHES.get(transceiver.getRemoteName()); if (remoteHash != null) { remote = REMOTE_PROTOCOLS.get(remoteHash); if (remote != null) return remote; // already cached } handshakeLock.lock(); try { // force handshake ByteBufferOutputStream bbo = new ByteBufferOutputStream(); // direct because the payload is tiny. Encoder out = ENCODER_FACTORY.directBinaryEncoder(bbo, null); writeHandshake(out); out.writeInt(0); // empty metadata out.writeString(""); // bogus message name List<ByteBuffer> response = getTransceiver().transceive(bbo.getBufferList()); ByteBufferInputStream bbi = new ByteBufferInputStream(response); BinaryDecoder in = DecoderFactory.get().binaryDecoder(bbi, null); readHandshake(in); return this.remote; } finally { handshakeLock.unlock(); } }
Decoder in = DecoderFactory.get().binaryDecoder( new ByteBufferInputStream(buffers), null); ByteBufferOutputStream bbo = new ByteBufferOutputStream(); BinaryEncoder out = EncoderFactory.get().binaryEncoder(bbo, null); Exception error = null; out.flush(); if (remote == null) // handshake failed return bbo.getBufferList(); handshake = bbo.getBufferList(); LOG.warn("system error", e); context.setError(e); bbo = new ByteBufferOutputStream(); out = EncoderFactory.get().binaryEncoder(bbo, null); out.writeBoolean(true); writeError(Protocol.SYSTEM_ERRORS, new Utf8(e.toString()), out); if (null == handshake) { handshake = new ByteBufferOutputStream().getBufferList(); payload = bbo.getBufferList(); out.flush(); bbo.prepend(handshake); bbo.append(payload); return bbo.getBufferList();
/** * Gets the request data, generating it first if necessary. * @return the request data. * @throws Exception if an error occurs generating the request data. */ public List<ByteBuffer> getBytes() throws Exception { if (requestBytes == null) { ByteBufferOutputStream bbo = new ByteBufferOutputStream(); BinaryEncoder out = ENCODER_FACTORY.binaryEncoder(bbo, encoder); // use local protocol to write request Message m = getMessage(); context.setMessage(m); writeRequest(m.getRequest(), request, out); // write request payload out.flush(); List<ByteBuffer> payload = bbo.getBufferList(); writeHandshake(out); // prepend handshake if needed context.setRequestPayload(payload); for (RPCPlugin plugin : rpcMetaPlugins) { plugin.clientSendRequest(context); // get meta-data from plugins } META_WRITER.write(context.requestCallMeta(), out); out.writeString(m.getName()); // write message name out.flush(); bbo.append(payload); requestBytes = bbo.getBufferList(); } return requestBytes; } }
ByteBufferOutputStream byteBufferOutputStream = new ByteBufferOutputStream(); List<ByteBuffer> response = transceiver.transceive(byteBufferOutputStream.getBufferList());
Decoder in = DecoderFactory.get().binaryDecoder( new ByteBufferInputStream(buffers), null); ByteBufferOutputStream bbo = new ByteBufferOutputStream(); BinaryEncoder out = EncoderFactory.get().binaryEncoder(bbo, null); Exception error = null; out.flush(); if (remote == null) // handshake failed return bbo.getBufferList(); handshake = bbo.getBufferList(); LOG.warn("system error", e); context.setError(e); bbo = new ByteBufferOutputStream(); out = EncoderFactory.get().binaryEncoder(bbo, null); out.writeBoolean(true); writeError(Protocol.SYSTEM_ERRORS, new Utf8(e.toString()), out); if (null == handshake) { handshake = new ByteBufferOutputStream().getBufferList(); payload = bbo.getBufferList(); out.flush(); bbo.prepend(handshake); bbo.append(payload); return bbo.getBufferList();
/** * Gets the request data, generating it first if necessary. * @return the request data. * @throws Exception if an error occurs generating the request data. */ public List<ByteBuffer> getBytes() throws Exception { if (requestBytes == null) { ByteBufferOutputStream bbo = new ByteBufferOutputStream(); BinaryEncoder out = ENCODER_FACTORY.binaryEncoder(bbo, encoder); // use local protocol to write request Message m = getMessage(); context.setMessage(m); writeRequest(m.getRequest(), request, out); // write request payload out.flush(); List<ByteBuffer> payload = bbo.getBufferList(); writeHandshake(out); // prepend handshake if needed context.setRequestPayload(payload); for (RPCPlugin plugin : rpcMetaPlugins) { plugin.clientSendRequest(context); // get meta-data from plugins } META_WRITER.write(context.requestCallMeta(), out); out.writeString(m.getName()); // write message name out.flush(); bbo.append(payload); requestBytes = bbo.getBufferList(); } return requestBytes; } }
@Test public void testReuse() throws IOException { ByteBufferOutputStream bbo1 = new ByteBufferOutputStream(); ByteBufferOutputStream bbo2 = new ByteBufferOutputStream(); byte[] b1 = new byte[] { 1, 2 }; BinaryEncoder e1 = e_factory.binaryEncoder(bbo1, null); e1.writeBytes(b1); e1.flush(); BinaryEncoder e2 = e_factory.binaryEncoder(bbo2, null); e2.writeBytes(b1); e2.flush(); DirectBinaryDecoder d = new DirectBinaryDecoder( new ByteBufferInputStream(bbo1.getBufferList())); ByteBuffer bb1 = d.readBytes(null); Assert.assertEquals(b1.length, bb1.limit() - bb1.position()); d.configure(new ByteBufferInputStream(bbo2.getBufferList())); ByteBuffer bb2 = d.readBytes(null); Assert.assertEquals(b1.length, bb2.limit() - bb2.position()); }
ByteBuffer buffer = ByteBuffer.allocate( 1000 ); ByteBufferOutputStream bufferOutput = new ByteBufferOutputStream( buffer ); GZIPOutputStream output = new GZIPOutputStream( bufferOutput ); OutputStreamWriter writer = new OutputStreamWriter( output, "UTF-8" ); writer.write( "log message\n" ); writer.close(); sock.getChannel().open(); // do this once sock.getChannel().write( buffer ); // Send compressed data
public ByteBufferOutputStream() { reset(); }
/** Add a buffer to the output without copying, if possible. */ public void writeBuffer(ByteBuffer buffer) throws IOException { if (buffer.remaining() < BUFFER_SIZE) { write(buffer.array(), buffer.position(), buffer.remaining()); } else { // append w/o copying bytes ByteBuffer dup = buffer.duplicate(); dup.position(buffer.limit()); // ready for flip buffers.add(dup); } } }
Serializer<T> serializer = serializationFactory.getSerializer(objClass); try (ByteBufferOutputStream os = new ByteBufferOutputStream()) { serializer.open(os); serializer.serialize(obj); List<ByteBuffer> buffers = os.getBufferList(); for(ByteBuffer buffer : buffers) { length += buffer.limit() - buffer.arrayOffset();
/** * Creates a Request. * @param messageName the name of the message to invoke. * @param request the request data to send. * @param context the RPC context to use. * @param encoder the BinaryEncoder to use to serialize the request. */ public Request(String messageName, Object request, RPCContext context, BinaryEncoder encoder) { this.messageName = messageName; this.request = request; this.context = context; this.encoder = ENCODER_FACTORY.binaryEncoder(new ByteBufferOutputStream(), encoder); }
/** Returns all data written and resets the stream to be empty. */ public List<ByteBuffer> getBufferList() { List<ByteBuffer> result = buffers; reset(); for (ByteBuffer buffer : result) buffer.flip(); return result; }
/** Add a buffer to the output without copying, if possible. */ public void writeBuffer(ByteBuffer buffer) throws IOException { if (buffer.remaining() < BUFFER_SIZE) { write(buffer.array(), buffer.position(), buffer.remaining()); } else { // append w/o copying bytes ByteBuffer dup = buffer.duplicate(); dup.position(buffer.limit()); // ready for flip buffers.add(dup); } } }
Serializer<T> serializer = serializationFactory.getSerializer(objClass); try (ByteBufferOutputStream os = new ByteBufferOutputStream()) { serializer.open(os); serializer.serialize(obj); List<ByteBuffer> buffers = os.getBufferList(); for(ByteBuffer buffer : buffers) { length += buffer.limit() - buffer.arrayOffset();
ByteBuffer buffer = ByteBuffer.allocate( 1000 ); ByteBufferOutputStream bufferOutput = new ByteBufferOutputStream( buffer ); GZIPOutputStream output = new GZIPOutputStream( bufferOutput ); output.write("stackexchange".getBytes()); output.close(); buffer.position( 0 ); byte[] result = new byte[ 1000 ]; ByteBufferInputStream bufferInput = new ByteBufferInputStream( buffer ); GZIPInputStream input = new GZIPInputStream( bufferInput ); input.read( result ); System.out.println( new String(result));
/** Returns all data written and resets the stream to be empty. */ public List<ByteBuffer> getBufferList() { List<ByteBuffer> result = buffers; reset(); for (ByteBuffer buffer : result) buffer.flip(); return result; }