private void triggerPipeliningLogic(HttpCarbonMessage outboundResponseMsg) {
        String httpVersion = (String) inboundRequestMsg.getProperty(Constants.HTTP_VERSION);
        if (outboundResponseMsg.isPipeliningEnabled() && Constants.HTTP_1_1_VERSION.equalsIgnoreCase
                (httpVersion)) {
            Queue responseQueue;
            synchronized (sourceContext.channel().attr(Constants.RESPONSE_QUEUE).get()) {
                responseQueue = sourceContext.channel().attr(Constants.RESPONSE_QUEUE).get();
                Long nextSequenceNumber = sourceContext.channel().attr(Constants.NEXT_SEQUENCE_NUMBER).get();
                //IMPORTANT:Next sequence number should never be incremented for interim 100 continue response
                //because the body of the request is yet to come. Only when the actual response is sent out, this
                //next sequence number should be updated.
                nextSequenceNumber++;
                sourceContext.channel().attr(Constants.NEXT_SEQUENCE_NUMBER).set(nextSequenceNumber);
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Current sequence id of the response : {}", outboundResponseMsg.getSequenceId());
                    LOG.debug("Updated next sequence id to : {}", nextSequenceNumber);
                }
            }
            if (!responseQueue.isEmpty()) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Pipelining logic is triggered from transport");
                }
                //Notify ballerina to send the response which is next in queue. This is needed because,
                //if the other responses got ready before the nextSequenceNumber gets updated then the
                //ballerina respond() won't start serializing the responses in queue. This is to trigger
                //that process again.
                if (outboundResponseMsg.getPipeliningFuture() != null) {
                    EventExecutorGroup pipeliningExecutor = sourceContext.channel().attr(Constants.PIPELINING_EXECUTOR)
                            .get();
                    //IMPORTANT:Pipelining logic should never be executed in an I/O thread as it might lead to I/O
                    //thread blocking scenarios in outbound trottling. Here, the pipelining logic runs in a thread that
                    //belongs to the pipelining thread pool.
                    pipeliningExecutor.execute(() -> outboundResponseMsg.getPipeliningFuture().
                            notifyPipeliningListener(sourceContext));

                }
            }
        }
    }
private void triggerPipeliningLogic ( HttpCarbonMessage outboundResponseMsg ) { String httpVersion = ( String ) inboundRequestMsg . getProperty ( Constants . HTTP_VERSION ) ; if ( outboundResponseMsg . isPipeliningEnabled ( ) && Constants . HTTP_1_1_VERSION . equalsIgnoreCase ( httpVersion ) ) { Queue responseQueue ; synchronized ( sourceContext . channel ( ) . attr ( Constants . RESPONSE_QUEUE ) . get ( ) ) { responseQueue = sourceContext . channel ( ) . attr ( Constants . RESPONSE_QUEUE ) . get ( ) ; Long nextSequenceNumber = sourceContext . channel ( ) . attr ( Constants . NEXT_SEQUENCE_NUMBER ) . get ( ) ; nextSequenceNumber ++ ; sourceContext . channel ( ) . attr ( Constants . NEXT_SEQUENCE_NUMBER ) . set ( nextSequenceNumber ) ; if ( LOG . isDebugEnabled ( ) ) { LOG . debug ( "Current sequence id of the response : {}" , outboundResponseMsg . getSequenceId ( ) ) ; LOG . debug ( "Updated next sequence id to : {}" , nextSequenceNumber ) ; } } if ( ! responseQueue . isEmpty ( ) ) { if ( LOG . isDebugEnabled ( ) ) { LOG . debug ( "Pipelining logic is triggered from transport" ) ; } if ( outboundResponseMsg . getPipeliningFuture ( ) != null ) { EventExecutorGroup pipeliningExecutor = sourceContext . channel ( ) . attr ( Constants . PIPELINING_EXECUTOR ) . get ( ) ; pipeliningExecutor . execute ( ( ) -> outboundResponseMsg . getPipeliningFuture ( ) . notifyPipeliningListener ( sourceContext ) ) ; } } } }
Increment the next expected sequence number and trigger the pipelining logic.

@param outboundResponseMsg Represent the outbound response