$npx -y skills add giuseppe-trisciuoglio/developer-kit --skill aws-sdk-java-v2-messagingProvides AWS messaging patterns using AWS SDK for Java 2.x for SQS queues and SNS topics. Handles sending/receiving messages, FIFO queues, DLQ, subscriptions, and pub/sub patterns. Use when implementing messaging with SQS or SNS.
| 1 | # AWS SDK for Java 2.x - Messaging (SQS & SNS) |
| 2 | |
| 3 | ## Overview |
| 4 | |
| 5 | Provides patterns for SQS queues and SNS topics with AWS SDK for Java 2.x: client setup, queue management, message operations, subscriptions, and Spring Boot integration. |
| 6 | |
| 7 | ## When to Use |
| 8 | |
| 9 | - Setting up SQS queues (standard or FIFO) for message buffering |
| 10 | - Implementing pub/sub with SNS topics and subscriptions |
| 11 | - Processing messages from SQS queues with long polling |
| 12 | - Configuring dead letter queues (DLQ) for error handling |
| 13 | - Integrating AWS messaging with Spring Boot applications |
| 14 | - Building event-driven architectures with SQS/SNS |
| 15 | |
| 16 | ## Examples |
| 17 | |
| 18 | ### Quick Setup |
| 19 | |
| 20 | **Dependencies:** |
| 21 | ```xml |
| 22 | <dependency> |
| 23 | <groupId>software.amazon.awssdk</groupId> |
| 24 | <artifactId>sqs</artifactId> |
| 25 | </dependency> |
| 26 | <dependency> |
| 27 | <groupId>software.amazon.awssdk</groupId> |
| 28 | <artifactId>sns</artifactId> |
| 29 | </dependency> |
| 30 | ``` |
| 31 | |
| 32 | **Client Configuration:** |
| 33 | ```java |
| 34 | SqsClient sqsClient = SqsClient.builder() |
| 35 | .region(Region.US_EAST_1) |
| 36 | .credentialsProvider(DefaultCredentialsProvider.create()) |
| 37 | .build(); |
| 38 | |
| 39 | SnsClient snsClient = SnsClient.builder() |
| 40 | .region(Region.US_EAST_1) |
| 41 | .build(); |
| 42 | ``` |
| 43 | |
| 44 | ### SQS Operations |
| 45 | |
| 46 | **Create and Send Message:** |
| 47 | ```java |
| 48 | String queueUrl = sqsClient.createQueue(CreateQueueRequest.builder() |
| 49 | .queueName("my-queue") |
| 50 | .build()).queueUrl(); |
| 51 | |
| 52 | String messageId = sqsClient.sendMessage(SendMessageRequest.builder() |
| 53 | .queueUrl(queueUrl) |
| 54 | .messageBody("Hello, SQS!") |
| 55 | .build()).messageId(); |
| 56 | ``` |
| 57 | |
| 58 | **Receive and Delete Message:** |
| 59 | ```java |
| 60 | ReceiveMessageResponse response = sqsClient.receiveMessage(ReceiveMessageRequest.builder() |
| 61 | .queueUrl(queueUrl) |
| 62 | .maxNumberOfMessages(10) |
| 63 | .waitTimeSeconds(20) |
| 64 | .build()); |
| 65 | |
| 66 | response.messages().forEach(message -> { |
| 67 | processMessage(message.body()); |
| 68 | sqsClient.deleteMessage(DeleteMessageRequest.builder() |
| 69 | .queueUrl(queueUrl) |
| 70 | .receiptHandle(message.receiptHandle()) |
| 71 | .build()); |
| 72 | }); |
| 73 | ``` |
| 74 | |
| 75 | **FIFO Queue:** |
| 76 | ```java |
| 77 | Map<QueueAttributeName, String> attributes = Map.of( |
| 78 | QueueAttributeName.FIFO_QUEUE, "true", |
| 79 | QueueAttributeName.CONTENT_BASED_DEDUPLICATION, "true" |
| 80 | ); |
| 81 | |
| 82 | String fifoQueueUrl = sqsClient.createQueue(CreateQueueRequest.builder() |
| 83 | .queueName("my-queue.fifo") |
| 84 | .attributes(attributes) |
| 85 | .build()).queueUrl(); |
| 86 | |
| 87 | sqsClient.sendMessage(SendMessageRequest.builder() |
| 88 | .queueUrl(fifoQueueUrl) |
| 89 | .messageBody("Order #12345") |
| 90 | .messageGroupId("orders") |
| 91 | .messageDeduplicationId(UUID.randomUUID().toString()) |
| 92 | .build()); |
| 93 | ``` |
| 94 | |
| 95 | ### SNS Operations |
| 96 | |
| 97 | **Create Topic and Publish:** |
| 98 | ```java |
| 99 | String topicArn = snsClient.createTopic(CreateTopicRequest.builder() |
| 100 | .name("my-topic") |
| 101 | .build()).topicArn(); |
| 102 | |
| 103 | snsClient.publish(PublishRequest.builder() |
| 104 | .topicArn(topicArn) |
| 105 | .subject("Test Notification") |
| 106 | .message("Hello, SNS!") |
| 107 | .build()); |
| 108 | ``` |
| 109 | |
| 110 | **SNS to SQS Subscription:** |
| 111 | ```java |
| 112 | String queueArn = sqsClient.getQueueAttributes(GetQueueAttributesRequest.builder() |
| 113 | .queueUrl(queueUrl) |
| 114 | .attributeNames(QueueAttributeName.QUEUE_ARN) |
| 115 | .build()).attributes().get(QueueAttributeName.QUEUE_ARN); |
| 116 | |
| 117 | snsClient.subscribe(SubscribeRequest.builder() |
| 118 | .protocol("sqs") |
| 119 | .endpoint(queueArn) |
| 120 | .topicArn(topicArn) |
| 121 | .build()); |
| 122 | ``` |
| 123 | |
| 124 | ### Spring Boot Integration |
| 125 | ```java |
| 126 | @Service |
| 127 | @RequiredArgsConstructor |
| 128 | public class OrderNotificationService { |
| 129 | private final SnsClient snsClient; |
| 130 | private final ObjectMapper objectMapper; |
| 131 | |
| 132 | @Value("${aws.sns.order-topic-arn}") |
| 133 | private String orderTopicArn; |
| 134 | |
| 135 | public void sendOrderNotification(Order order) throws JsonProcessingException { |
| 136 | snsClient.publish(PublishRequest.builder() |
| 137 | .topicArn(orderTopicArn) |
| 138 | .subject("New Order Received") |
| 139 | .message(objectMapper.writeValueAsString(order)) |
| 140 | .messageAttributes(Map.of( |
| 141 | "orderType", MessageAttributeValue.builder() |
| 142 | .dataType("String") |
| 143 | .stringValue(order.getType()) |
| 144 | .build())) |
| 145 | .build()); |
| 146 | } |
| 147 | } |
| 148 | ``` |
| 149 | |
| 150 | ## Instructions |
| 151 | |
| 152 | ### Implement Message Processing (with Validation) |
| 153 | |
| 154 | 1. **Create queues/topics** with appropriate configuration |
| 155 | 2. **Send messages** and validate `messageId` is returned |
| 156 | 3. **Receive messages** with long polling (`waitTimeSeconds: 20`) |
| 157 | 4. **Process messages** - validate payload before processing |
| 158 | 5. **Delete messages** only after successful processing - verify deletion response |
| 159 | 6. **Check DLQ** periodically for failed messages using `redrivePolicy` |
| 160 | 7. **Verify delivery** - monitor CloudWatch `NumberOfMessagesSent` metric |
| 161 | |
| 162 | **Validation Checklist:** |
| 163 | ```java |
| 164 | // After send |
| 165 | if (messageId == null || messageId.isEmpty()) |