public synchronized int send(short channel, FrameBody body, ByteBuffer payload) { if (!_closedForOutput) { ValueWriter<FrameBody> writer = _describedTypeRegistry.getValueWriter(body); int size = writer.writeToBuffer(EMPTY_BYTE_BUFFER); ByteBuffer payloadDup = payload == null ? null : payload.duplicate(); int payloadSent = getMaxFrameSize() - (size + 9); if (payloadSent < (payload == null ? 0 : payload.remaining())) { if (body instanceof Transfer) { ((Transfer) body).setMore(Boolean.TRUE); } writer = _describedTypeRegistry.getValueWriter(body); size = writer.writeToBuffer(EMPTY_BYTE_BUFFER); payloadSent = getMaxFrameSize() - (size + 9); try { payloadDup.limit(payloadDup.position() + payloadSent); } catch (NullPointerException npe) { throw npe; } } else { payloadSent = payload == null ? 0 : payload.remaining(); } _frameOutputHandler.send(AMQFrame.createAMQFrame(channel, body, payloadDup)); return payloadSent; } else { return -1; } }