@Override
    public VirtualConnection finishRawResponseMessage(WsByteBuffer[] body, InterChannelCallback cb, boolean bForce) throws MessageSentException {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
            Tr.entry(tc, "finishRawResponseMessage(async)");
        }
        setRawBody(true);
        VirtualConnection vc = finishResponseMessage(body, cb, bForce);
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
            Tr.exit(tc, "finishRawResponseMessage(async): " + vc);
        }
        return vc;
    }
@ Override public VirtualConnection finishRawResponseMessage ( WsByteBuffer [ ] body , InterChannelCallback cb , boolean bForce ) throws MessageSentException { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEntryEnabled ( ) ) { Tr . entry ( tc , "finishRawResponseMessage(async)" ) ; } setRawBody ( true ) ; VirtualConnection vc = finishResponseMessage ( body , cb , bForce ) ; if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEntryEnabled ( ) ) { Tr . exit ( tc , "finishRawResponseMessage(async): " + vc ) ; } return vc ; }
Finish sending the response message asynchronously. The body buffers can
be null if there is no more actual body. This method will avoid any
body modifications, such as compression or chunked-encoding. If the
headers have not been sent yet, then they will be prepended to the input
data.
<p>
If the asynchronous write can be done immediately, then this will return a
VirtualConnection and the caller's callback will not be used. If this
returns null, then the callback will be used when complete.
<p>
The force flag allows the caller to force the asynchronous communication
such that the callback is always used.

@param body
-- null if there is no more body data
@param cb
@param bForce
@return VirtualConnection
@throws MessageSentException
-- if a finishMessage API was already used