docs: private void _send(SIBusMessage msg, SITransaction tran)
        throws SISessionUnavailableException, SISessionDroppedException,
               SIConnectionUnavailableException, SIConnectionDroppedException,
               SIResourceException, SIConnectionLostException, SILimitExceededException, 
               SIErrorException,
               SINotAuthorizedException,
               SIIncorrectCallException,
               SINotPossibleInCurrentConfigurationException 
     {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "_send");
        
        boolean sendSuccessful = false;
        // Get the message priority
        short jfapPriority = JFapChannelConstants.getJFAPPriority(msg.getPriority());
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Sending with JFAP priority of " + jfapPriority);
              
        updateLowestPriority(jfapPriority);
  
        // *** Complex logic to determine if we can get away we need a reply to ***
        // *** this send operation.                                             ***
        final boolean requireReply;
        if (tran != null && !exchangeTransactedSends)
        {
           // If there is a transaction, and we haven't been explicitly told to exchange
           // transacted sends - then a reply is NOT required.
           requireReply = false;
        }
        else if (exchangeExpressSends)
        {
           // We have been prohibited from sending (rather than exchanging) low
           // qualities of service - thus there is no way that we can avoid requiring
           // a reply.
           requireReply = true;
        }
        else
        {
           // We CAN perform the optimization where low qualities of service can be sent
           // without requiring a reply.  Check the message quality of service.
           requireReply = (msg.getReliability() != Reliability.BEST_EFFORT_NONPERSISTENT) &&
                          (msg.getReliability() != Reliability.EXPRESS_NONPERSISTENT);
        }
        // *** end of "is a reply required" logic ***
        
        // If we are at FAP9 or above we can do a 'chunked' send of the message in seperate 
        // slices to make life easier on the Java memory manager
        final HandshakeProperties props = getConversation().getHandshakeProperties(); 
        if (props.getFapLevel() >= JFapChannelConstants.FAP_VERSION_9)
        {
           sendChunkedMessage(tran, msg, requireReply, jfapPriority);
        }
        else
        {
           sendEntireMessage(tran, msg, null, requireReply, jfapPriority);
        }
        
        sendSuccessful = true;
  
        if (TraceComponent.isAnyTracingEnabled()) 
          CommsLightTrace.traceMessageId(tc, "SendMsgTrace", msg);
        
        
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "_send");
     }