Class SQSMessageConsumerPrefetch

java.lang.Object
com.amazon.sqs.javamessaging.SQSMessageConsumerPrefetch
All Implemented Interfaces:
PrefetchManager, Runnable

public class SQSMessageConsumerPrefetch extends Object implements Runnable, PrefetchManager
Used internally to prefetch messages to internal buffer on a background thread for better receive turn around times.

Each message consumer creates one prefetch thread.

This runs until the message consumer is closed and in-progress SQS receiveMessage call returns.

Uses SQS receiveMessage with long-poll wait time of WAIT_TIME_SECONDS (default to 20) seconds.

Add re-tries on top of SqsClient re-tries on SQS calls.

  • Field Details

    • WAIT_TIME_SECONDS

      protected static int WAIT_TIME_SECONDS
    • ALL

      protected static final String ALL
      See Also:
    • messageQueue

      Internal buffer of Messages. The size of queue is MIN_BATCH by default and it can be changed by user.
    • messagesPrefetched

      protected int messagesPrefetched
      Counter on how many messages are prefetched into internal messageQueue.
    • messagesRequested

      protected int messagesRequested
      Counter on how many messages have been explicitly requested. TODO: Consider renaming this class and several other variables now that this logic factors in message requests as well as prefetching.
    • closed

      protected volatile boolean closed
      States of the prefetch thread
    • running

      protected volatile boolean running
    • retriesAttempted

      protected int retriesAttempted
      Controls the number of retry attempts to the SQS
    • backoffStrategy

      protected ExponentialBackoffStrategy backoffStrategy
      AWS SQS SDK with default backup strategy already re-tries 3 times exponentially. This backoff is on top of that to let the prefetch thread backoff after SDK completes re-tries with a max delay of 2 seconds and 25ms delayInterval.
  • Method Details

    • getMessageConsumer

      public SQSMessageConsumer getMessageConsumer()
      Description copied from interface: PrefetchManager
      This is used to determine the state of the consumer, when the message listener scheduler is processing the messages.
      Specified by:
      getMessageConsumer in interface PrefetchManager
      Returns:
      The message consumer, which owns the prefetchThread
    • setMessageListener

      protected void setMessageListener(jakarta.jms.MessageListener messageListener)
      Sets the message listener.

      If message listener is set, the existing messages on the internal buffer will be pushed to session callback scheduler.

      If message lister is set to null, then the messages on the internal buffer of session callback scheduler will be negative acknowledged, which will be handled by the session callback scheduler thread itself.

    • run

      public void run()
      Runs until the message consumer is closed and in-progress SQS receiveMessage call returns.

      This blocks if configured number of prefetched messages are already received or connection has not started yet.

      After consumer is closed, all the messages inside internal buffer will be negatively acknowledged.

      Specified by:
      run in interface Runnable
    • getMessages

      protected List<software.amazon.awssdk.services.sqs.model.Message> getMessages(int batchSize, int waitTimeSeconds) throws jakarta.jms.JMSException
      Call receiveMessage with the given wait time.
      Throws:
      jakarta.jms.JMSException
    • processReceivedMessages

      protected void processReceivedMessages(List<software.amazon.awssdk.services.sqs.model.Message> messages)
      Converts the received message to JMS message, and pushes to messages to either callback scheduler for asynchronous message delivery or to internal buffers for synchronous message delivery. Messages that was not converted to JMS message will be immediately negative acknowledged.
    • getMessagesWithBackoff

      protected List<software.amazon.awssdk.services.sqs.model.Message> getMessagesWithBackoff(int batchSize) throws InterruptedException
      Throws:
      InterruptedException
    • waitForPrefetch

      protected void waitForPrefetch() throws InterruptedException
      Throws:
      InterruptedException
    • convertToJMSMessage

      protected jakarta.jms.Message convertToJMSMessage(software.amazon.awssdk.services.sqs.model.Message message) throws jakarta.jms.JMSException
      Convert the return SQS message into JMS message
      Parameters:
      message - SQS message to convert
      Returns:
      Converted JMS message
      Throws:
      jakarta.jms.JMSException
    • nackQueueMessages

      protected void nackQueueMessages()
    • waitForStart

      protected void waitForStart() throws InterruptedException
      Throws:
      InterruptedException
    • messageDispatched

      public void messageDispatched()
      Description copied from interface: PrefetchManager
      Notify the prefetchThread that the message is dispatched from messageQueue when user calls for receive or message listener onMessage is called.
      Specified by:
      messageDispatched in interface PrefetchManager
    • messageListenerReady

      public void messageListenerReady()
      Description copied from interface: PrefetchManager
      Notify the prefetchThread that the message listener has finished with any previous message and is ready to accept another.
      Specified by:
      messageListenerReady in interface PrefetchManager
    • notifyStateChange

      protected void notifyStateChange()
    • sleep

      protected void sleep(long sleepTimeMillis) throws InterruptedException
      Sleeps for the configured time.
      Throws:
      InterruptedException
    • isClosed

      protected boolean isClosed()