final ClientProducerCredits credits, SendAcknowledgementHandler handler)
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 boolean requiresResponse = lastChunk && sendBlocking;
SendAcknowledgementHandler messageHandler = lastChunk ? handler : null;
final SessionSendContinuationMessage chunk =
new SessionSendContinuationMessage(msgI, bodyBuffer.toByteBuffer().array(), !lastChunk,
requiresResponse, messageHandler);
if (requiresResponse)
{
// 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();
}
}