The AWS Java SDK for Amazon SQS module provides client classes for communicating with Amazon Simple Queue Service
—
Message operations provide the core functionality for sending, receiving, and deleting messages in Amazon SQS queues. This includes both individual message operations and efficient batch operations for high-throughput scenarios.
Send individual messages to a queue with optional attributes and configuration.
SendMessageResult sendMessage(SendMessageRequest request);
// Convenience method
SendMessageResult sendMessage(String queueUrl, String messageBody);
class SendMessageRequest extends AmazonWebServiceRequest {
SendMessageRequest();
SendMessageRequest(String queueUrl, String messageBody);
String getQueueUrl();
SendMessageRequest withQueueUrl(String queueUrl);
String getMessageBody();
SendMessageRequest withMessageBody(String messageBody);
Integer getDelaySeconds();
SendMessageRequest withDelaySeconds(Integer delaySeconds);
Map<String, MessageAttributeValue> getMessageAttributes();
SendMessageRequest withMessageAttributes(Map<String, MessageAttributeValue> messageAttributes);
SendMessageRequest addMessageAttributesEntry(String key, MessageAttributeValue value);
Map<String, MessageSystemAttributeValue> getMessageSystemAttributes();
SendMessageRequest withMessageSystemAttributes(Map<String, MessageSystemAttributeValue> messageSystemAttributes);
// FIFO queue specific
String getMessageDeduplicationId();
SendMessageRequest withMessageDeduplicationId(String messageDeduplicationId);
String getMessageGroupId();
SendMessageRequest withMessageGroupId(String messageGroupId);
}
class SendMessageResult {
String getMD5OfBody();
String getMD5OfMessageAttributes();
String getMessageId();
String getSequenceNumber(); // FIFO queues only
}Usage Example:
// Basic message send
SendMessageRequest request = new SendMessageRequest()
.withQueueUrl("https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue")
.withMessageBody("Hello, SQS!");
SendMessageResult result = client.sendMessage(request);
System.out.println("Message ID: " + result.getMessageId());
// Message with attributes
MessageAttributeValue attribute = new MessageAttributeValue()
.withDataType("String")
.withStringValue("OrderProcessing");
SendMessageRequest requestWithAttrs = new SendMessageRequest()
.withQueueUrl(queueUrl)
.withMessageBody("Order data: {...}")
.addMessageAttributesEntry("MessageType", attribute)
.withDelaySeconds(30); // Delay 30 seconds
client.sendMessage(requestWithAttrs);
// FIFO queue message
SendMessageRequest fifoRequest = new SendMessageRequest()
.withQueueUrl("https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue.fifo")
.withMessageBody("FIFO message")
.withMessageGroupId("group1")
.withMessageDeduplicationId("unique-id-123");
client.sendMessage(fifoRequest);Send up to 10 messages in a single API call for improved throughput and cost efficiency.
SendMessageBatchResult sendMessageBatch(SendMessageBatchRequest request);
// Convenience method
SendMessageBatchResult sendMessageBatch(String queueUrl, List<SendMessageBatchRequestEntry> entries);
class SendMessageBatchRequest extends AmazonWebServiceRequest {
String getQueueUrl();
SendMessageBatchRequest withQueueUrl(String queueUrl);
List<SendMessageBatchRequestEntry> getEntries();
SendMessageBatchRequest withEntries(List<SendMessageBatchRequestEntry> entries);
SendMessageBatchRequest withEntries(SendMessageBatchRequestEntry... entries);
}
class SendMessageBatchRequestEntry {
String getId();
SendMessageBatchRequestEntry withId(String id);
String getMessageBody();
SendMessageBatchRequestEntry withMessageBody(String messageBody);
Integer getDelaySeconds();
SendMessageBatchRequestEntry withDelaySeconds(Integer delaySeconds);
Map<String, MessageAttributeValue> getMessageAttributes();
SendMessageBatchRequestEntry withMessageAttributes(Map<String, MessageAttributeValue> messageAttributes);
String getMessageDeduplicationId();
SendMessageBatchRequestEntry withMessageDeduplicationId(String messageDeduplicationId);
String getMessageGroupId();
SendMessageBatchRequestEntry withMessageGroupId(String messageGroupId);
}
class SendMessageBatchResult {
List<SendMessageBatchResultEntry> getSuccessful();
List<BatchResultErrorEntry> getFailed();
}
class SendMessageBatchResultEntry {
String getId();
String getMD5OfBody();
String getMD5OfMessageAttributes();
String getMessageId();
String getSequenceNumber();
}Usage Example:
// Create batch entries
List<SendMessageBatchRequestEntry> entries = Arrays.asList(
new SendMessageBatchRequestEntry()
.withId("msg1")
.withMessageBody("First message"),
new SendMessageBatchRequestEntry()
.withId("msg2")
.withMessageBody("Second message")
.withDelaySeconds(60),
new SendMessageBatchRequestEntry()
.withId("msg3")
.withMessageBody("Third message")
.addMessageAttributesEntry("Priority",
new MessageAttributeValue().withDataType("String").withStringValue("High"))
);
SendMessageBatchRequest batchRequest = new SendMessageBatchRequest()
.withQueueUrl(queueUrl)
.withEntries(entries);
SendMessageBatchResult batchResult = client.sendMessageBatch(batchRequest);
// Process results
for (SendMessageBatchResultEntry success : batchResult.getSuccessful()) {
System.out.println("Sent message: " + success.getId() + " -> " + success.getMessageId());
}
for (BatchResultErrorEntry error : batchResult.getFailed()) {
System.err.println("Failed message: " + error.getId() + " - " + error.getMessage());
}Retrieve messages from a queue with configurable options for long polling, message attributes, and batch size.
ReceiveMessageResult receiveMessage(ReceiveMessageRequest request);
// Convenience method
ReceiveMessageResult receiveMessage(String queueUrl);
class ReceiveMessageRequest extends AmazonWebServiceRequest {
ReceiveMessageRequest();
ReceiveMessageRequest(String queueUrl);
String getQueueUrl();
ReceiveMessageRequest withQueueUrl(String queueUrl);
List<String> getAttributeNames();
ReceiveMessageRequest withAttributeNames(List<String> attributeNames);
ReceiveMessageRequest withAttributeNames(String... attributeNames);
ReceiveMessageRequest withAttributeNames(QueueAttributeName... attributeNames);
List<String> getMessageAttributeNames();
ReceiveMessageRequest withMessageAttributeNames(List<String> messageAttributeNames);
ReceiveMessageRequest withMessageAttributeNames(String... messageAttributeNames);
Integer getMaxNumberOfMessages();
ReceiveMessageRequest withMaxNumberOfMessages(Integer maxNumberOfMessages);
Integer getVisibilityTimeout();
ReceiveMessageRequest withVisibilityTimeout(Integer visibilityTimeout);
Integer getWaitTimeSeconds();
ReceiveMessageRequest withWaitTimeSeconds(Integer waitTimeSeconds);
String getReceiveRequestAttemptId();
ReceiveMessageRequest withReceiveRequestAttemptId(String receiveRequestAttemptId);
}
class ReceiveMessageResult {
List<Message> getMessages();
}
class Message {
String getMessageId();
String getReceiptHandle();
String getMD5OfBody();
String getBody();
Map<String, String> getAttributes();
String getMD5OfMessageAttributes();
Map<String, MessageAttributeValue> getMessageAttributes();
}Usage Example:
// Basic message receive
ReceiveMessageRequest request = new ReceiveMessageRequest(queueUrl);
ReceiveMessageResult result = client.receiveMessage(request);
for (Message message : result.getMessages()) {
System.out.println("Received: " + message.getBody());
// Process message...
}
// Advanced receive with long polling and attributes
ReceiveMessageRequest advancedRequest = new ReceiveMessageRequest()
.withQueueUrl(queueUrl)
.withMaxNumberOfMessages(10)
.withWaitTimeSeconds(20) // Long polling
.withVisibilityTimeout(60) // 1 minute visibility
.withAttributeNames(QueueAttributeName.All)
.withMessageAttributeNames("All");
ReceiveMessageResult advancedResult = client.receiveMessage(advancedRequest);
for (Message message : advancedResult.getMessages()) {
System.out.println("Message ID: " + message.getMessageId());
System.out.println("Body: " + message.getBody());
System.out.println("Receipt Handle: " + message.getReceiptHandle());
// Access message attributes
for (Map.Entry<String, MessageAttributeValue> attr : message.getMessageAttributes().entrySet()) {
System.out.println("Attribute " + attr.getKey() + ": " + attr.getValue().getStringValue());
}
// Access system attributes
for (Map.Entry<String, String> attr : message.getAttributes().entrySet()) {
System.out.println("System attribute " + attr.getKey() + ": " + attr.getValue());
}
}Remove processed messages from the queue using receipt handles.
DeleteMessageResult deleteMessage(DeleteMessageRequest request);
// Convenience method
DeleteMessageResult deleteMessage(String queueUrl, String receiptHandle);
class DeleteMessageRequest extends AmazonWebServiceRequest {
DeleteMessageRequest();
DeleteMessageRequest(String queueUrl, String receiptHandle);
String getQueueUrl();
DeleteMessageRequest withQueueUrl(String queueUrl);
String getReceiptHandle();
DeleteMessageRequest withReceiptHandle(String receiptHandle);
}
class DeleteMessageResult {
// Empty result class - success indicated by no exception
}Usage Example:
// Receive and delete pattern
ReceiveMessageResult receiveResult = client.receiveMessage(new ReceiveMessageRequest(queueUrl));
for (Message message : receiveResult.getMessages()) {
try {
// Process the message
processMessage(message);
// Delete after successful processing
client.deleteMessage(new DeleteMessageRequest()
.withQueueUrl(queueUrl)
.withReceiptHandle(message.getReceiptHandle()));
System.out.println("Deleted message: " + message.getMessageId());
} catch (Exception e) {
System.err.println("Failed to process message: " + e.getMessage());
// Don't delete - message will become visible again
}
}Delete up to 10 messages in a single API call.
DeleteMessageBatchResult deleteMessageBatch(DeleteMessageBatchRequest request);
// Convenience method
DeleteMessageBatchResult deleteMessageBatch(String queueUrl, List<DeleteMessageBatchRequestEntry> entries);
class DeleteMessageBatchRequest extends AmazonWebServiceRequest {
String getQueueUrl();
DeleteMessageBatchRequest withQueueUrl(String queueUrl);
List<DeleteMessageBatchRequestEntry> getEntries();
DeleteMessageBatchRequest withEntries(List<DeleteMessageBatchRequestEntry> entries);
DeleteMessageBatchRequest withEntries(DeleteMessageBatchRequestEntry... entries);
}
class DeleteMessageBatchRequestEntry {
String getId();
DeleteMessageBatchRequestEntry withId(String id);
String getReceiptHandle();
DeleteMessageBatchRequestEntry withReceiptHandle(String receiptHandle);
}
class DeleteMessageBatchResult {
List<DeleteMessageBatchResultEntry> getSuccessful();
List<BatchResultErrorEntry> getFailed();
}
class DeleteMessageBatchResultEntry {
String getId();
}Usage Example:
// Batch delete after processing
List<DeleteMessageBatchRequestEntry> deleteEntries = new ArrayList<>();
ReceiveMessageResult receiveResult = client.receiveMessage(new ReceiveMessageRequest(queueUrl));
for (Message message : receiveResult.getMessages()) {
try {
// Process message
processMessage(message);
// Add to batch delete list
deleteEntries.add(new DeleteMessageBatchRequestEntry()
.withId(message.getMessageId())
.withReceiptHandle(message.getReceiptHandle()));
} catch (Exception e) {
System.err.println("Skipping delete for failed message: " + message.getMessageId());
}
}
// Perform batch delete
if (!deleteEntries.isEmpty()) {
DeleteMessageBatchRequest deleteRequest = new DeleteMessageBatchRequest()
.withQueueUrl(queueUrl)
.withEntries(deleteEntries);
DeleteMessageBatchResult deleteResult = client.deleteMessageBatch(deleteRequest);
System.out.println("Successfully deleted: " + deleteResult.getSuccessful().size() + " messages");
for (BatchResultErrorEntry error : deleteResult.getFailed()) {
System.err.println("Failed to delete: " + error.getId() + " - " + error.getMessage());
}
}Add custom metadata to messages for routing, processing, and filtering.
class MessageAttributeValue {
String getStringValue();
MessageAttributeValue withStringValue(String stringValue);
java.nio.ByteBuffer getBinaryValue();
MessageAttributeValue withBinaryValue(java.nio.ByteBuffer binaryValue);
List<String> getStringListValues();
MessageAttributeValue withStringListValues(List<String> stringListValues);
List<java.nio.ByteBuffer> getBinaryListValues();
MessageAttributeValue withBinaryListValues(List<java.nio.ByteBuffer> binaryListValues);
String getDataType();
MessageAttributeValue withDataType(String dataType);
}Usage Example:
// Create various attribute types
Map<String, MessageAttributeValue> attributes = new HashMap<>();
// String attribute
attributes.put("MessageType", new MessageAttributeValue()
.withDataType("String")
.withStringValue("Order"));
// Number attribute
attributes.put("Priority", new MessageAttributeValue()
.withDataType("Number")
.withStringValue("5"));
// Binary attribute
attributes.put("Thumbnail", new MessageAttributeValue()
.withDataType("Binary")
.withBinaryValue(ByteBuffer.wrap(imageBytes)));
// String list attribute
attributes.put("Tags", new MessageAttributeValue()
.withDataType("String.Array")
.withStringListValues(Arrays.asList("urgent", "customer-order")));
// Send message with attributes
SendMessageRequest request = new SendMessageRequest()
.withQueueUrl(queueUrl)
.withMessageBody("Order data")
.withMessageAttributes(attributes);
client.sendMessage(request);Common exceptions and error handling patterns for message operations:
try {
SendMessageResult result = client.sendMessage(request);
} catch (InvalidMessageContentsException e) {
// Message body contains invalid characters
System.err.println("Invalid message content: " + e.getMessage());
} catch (QueueDoesNotExistException e) {
// Queue URL is invalid or queue was deleted
System.err.println("Queue not found: " + e.getMessage());
} catch (UnsupportedOperationException e) {
// Operation not supported (e.g., invalid queue type)
System.err.println("Unsupported operation: " + e.getMessage());
}
// Batch operation error handling
try {
SendMessageBatchResult result = client.sendMessageBatch(batchRequest);
// Check for partial failures
if (!result.getFailed().isEmpty()) {
for (BatchResultErrorEntry error : result.getFailed()) {
System.err.println("Batch entry " + error.getId() + " failed: " +
error.getCode() + " - " + error.getMessage());
}
}
} catch (EmptyBatchRequestException e) {
System.err.println("Batch request was empty");
} catch (TooManyEntriesInBatchRequestException e) {
System.err.println("Too many entries in batch (max 10)");
} catch (BatchEntryIdsNotDistinctException e) {
System.err.println("Batch entry IDs must be unique");
}Install with Tessl CLI
npx tessl i tessl/maven-com-amazonaws--aws-java-sdk-sqs