final MessageInternal msgI,
final ClientProducerCredits credits) throws HornetQException
{
sendInitialLargeMessageHeader(msgI, credits);
BodyEncoder context = msgI.getBodyEncoder();
final long bodySize = context.getLargeBodySize();
context.open();
try
{
for (int pos = 0; pos < bodySize; )
{
final boolean lastChunk;
final int chunkLength = Math.min((int)(bodySize - pos), minLargeMessageSize);
final HornetQBuffer bodyBuffer = HornetQBuffers.fixedBuffer(chunkLength);
context.encode(bodyBuffer, chunkLength);
pos += chunkLength;
lastChunk = pos >= bodySize;
final SessionSendContinuationMessage chunk = new SessionSendContinuationMessage(msgI,
bodyBuffer.toByteBuffer()
.array(),
!lastChunk,
lastChunk && sendBlocking);
if (sendBlocking && lastChunk)
{
// When sending it blocking, only the last chunk will be blocking.
channel.sendBlocking(chunk, PacketImpl.NULL_RESPONSE);
}
else
{
channel.send(chunk);
}
try
{
credits.acquireCredits(chunk.getPacketSize());
}
catch (InterruptedException e)
{
throw new HornetQInterruptedException(e);
}
}
}
finally
{
context.close();
}
}