code: @Override
      public VirtualConnection sendRequestBody(WsByteBuffer[] body, InterChannelCallback callback, boolean bForce) throws MessageSentException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "sendRequestBody(async)");
          }
  
          if (isMessageSent()) {
              throw new MessageSentException("Message already sent");
          }
  
          // if headers haven't been sent, then set for partial body transfer
          if (!headersSent()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Setting partial body true");
              }
              setPartialBody(true);
          }
  
          getLink().setAllowReconnect(true);
          setForceAsync(bForce);
          setAppWriteCallback(callback);
          VirtualConnection vc = sendOutgoing(body, getRequestImpl(), HttpOSCWriteCallback.getRef());
          // Note: if forcequeue is true, then we will not get a VC object as
          // the lower layer will use the callback and return null
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "sendRequestBody(async): " + vc);
          }
          return vc;
      }
docs: Send the given body buffers for the outgoing request asynchronously.
  If chunked encoding is set, then each call to this method will be
  considered a "chunk" and encoded as such. If the message is
  Content-Length defined, then the buffers will simply be sent out with no
  modifications.
  
  Note: if headers have not already been sent, then the first call to
  this method will send the headers.
  
  If the write can be done immediately, the VirtualConnection will be
  returned and the callback will not be used. The caller is responsible
  for handling that situation in their code. A null return code means
  that the async write is in progress.
  
  The boolean bForce parameter allows the caller to force the asynchronous
  action even if it could be handled immediately. The return
  code will always be null and the callback always used.
  
  @param body
  @param callback
  @param bForce
  @return VirtualConnection
  @throws MessageSentException
  -- if a finishMessage API was already used