Class SQSMessageConsumerPrefetch
- All Implemented Interfaces:
PrefetchManager
,Runnable
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.
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final String
protected ExponentialBackoffStrategy
AWS SQS SDK with default backup strategy already re-tries 3 times exponentially.protected boolean
States of the prefetch threadprotected final ArrayDeque<SQSMessageConsumerPrefetch.MessageManager>
Internal buffer of Messages.protected int
Counter on how many messages are prefetched into internal messageQueue.protected int
Counter on how many messages have been explicitly requested.protected int
Controls the number of retry attempts to the SQSprotected boolean
protected static int
-
Method Summary
Modifier and TypeMethodDescriptionprotected jakarta.jms.Message
convertToJMSMessage
(software.amazon.awssdk.services.sqs.model.Message message) Convert the return SQS message into JMS messageThis is used to determine the state of the consumer, when the message listener scheduler is processing the messages.protected List<software.amazon.awssdk.services.sqs.model.Message>
getMessages
(int batchSize, int waitTimeSeconds) CallreceiveMessage
with the given wait time.protected List<software.amazon.awssdk.services.sqs.model.Message>
getMessagesWithBackoff
(int batchSize) protected boolean
isClosed()
void
Notify the prefetchThread that the message is dispatched from messageQueue when user calls for receive or message listener onMessage is called.void
Notify the prefetchThread that the message listener has finished with any previous message and is ready to accept another.protected void
protected void
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.void
run()
Runs until the message consumer is closed and in-progress SQSreceiveMessage
call returns.protected void
setMessageListener
(jakarta.jms.MessageListener messageListener) Sets the message listener.protected void
sleep
(long sleepTimeMillis) Sleeps for the configured time.protected void
protected void
-
Field Details
-
WAIT_TIME_SECONDS
protected static int WAIT_TIME_SECONDS -
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 messagesPrefetchedCounter on how many messages are prefetched into internal messageQueue. -
messagesRequested
protected int messagesRequestedCounter 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 closedStates of the prefetch thread -
running
protected volatile boolean running -
retriesAttempted
protected int retriesAttemptedControls the number of retry attempts to the SQS -
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
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 interfacePrefetchManager
- 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 SQSreceiveMessage
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.
-
getMessages
protected List<software.amazon.awssdk.services.sqs.model.Message> getMessages(int batchSize, int waitTimeSeconds) throws jakarta.jms.JMSException CallreceiveMessage
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
- 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
- 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 interfacePrefetchManager
-
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 interfacePrefetchManager
-
notifyStateChange
protected void notifyStateChange() -
sleep
Sleeps for the configured time.- Throws:
InterruptedException
-
isClosed
protected boolean isClosed()
-