docs: private void processMessage(CommsByteBuffer buffer, boolean asyncMessage,
                                 boolean enableReadAhead, Conversation conversation, boolean chunk)
     {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "processMessage",
                                             new Object[]{buffer, asyncMessage, enableReadAhead, conversation, chunk});
  
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) buffer.dump(this, tc, CommsByteBuffer.ENTIRE_BUFFER);
  
        // Connection object ID - not needed by us
        short connectionObjectID = buffer.getShort();
        // Client session ID (proxy ID)
        short clientSessionID = buffer.getShort();
  
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
        {
           SibTr.debug(this, tc, "connectionObjectId: ", ""+connectionObjectID);
           SibTr.debug(this, tc, "clientSessionID: ", ""+clientSessionID);
        }
        boolean lastInBatch = false;
  
        if (asyncMessage)
        {
           // Flags
           short flags = buffer.getShort();
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "lastInBatchFlag: ", ""+flags);
           if (flags == 0x0001) lastInBatch = true;
        }
  
        // Message Batch
        short messageBatch = buffer.getShort();
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "messageBatch: ", ""+messageBatch);
  
        // Data length for debug purposes only
        if (chunk)
        {
           // Get the next 8 bytes which will contain 1 byte of flags, 4 bytes of length and then some
           // message data
           long next8bytes = buffer.peekLong();
           // Chop the message data
           long messageLength = next8bytes >> 24;
           // Chop off the 5th byte
           messageLength &= ~0xFF00000000L;
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Received a message chunk of length: " + messageLength);
        }
        else
        {
           int messageLength = (int) buffer.peekLong();
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Received a message of length: " + messageLength);
        }
  
        // Now pass the info off to the proxy queue
        // Get the conversation state and the get the proxy group from it
        ProxyQueueConversationGroup pqcg = ((ClientConversationState) conversation.getAttachment()).getProxyQueueConversationGroup();
        // If this is null, something has gone wrong here
        if (pqcg == null)
        {
           SIErrorException e = new SIErrorException(nls.getFormattedMessage("NO_PROXY_CONV_GROUP_SICO1011", null, null));
           FFDCFilter.processException(e, CLASS_NAME + ".processAsyncMessage",
                                       CommsConstants.PROXYRECEIVELISTENER_PROCESSMSG_01, this);
           SibTr.error(tc, "NO_PROXY_CONV_GROUP_SICO1011", e);
           throw e;
        }
        // Otherwise get the proxy queue
        ProxyQueue proxyQueue = pqcg.find(clientSessionID);
        if (proxyQueue == null)
        {
           SIErrorException e = new SIErrorException(nls.getFormattedMessage("UNABLE_TO_FIND_PROXY_QUEUE_SICO1012", null, null));
           FFDCFilter.processException(e, CLASS_NAME + ".processAsyncMessage",
                                       CommsConstants.PROXYRECEIVELISTENER_PROCESSMSG_01, this);
           SibTr.error(tc, "UNABLE_TO_FIND_PROXY_QUEUE_SICO1012", e);
           throw e;
        }
  
        // and put the message
        proxyQueue.put(buffer, messageBatch, lastInBatch, chunk);
  
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "processMessage");
     }