Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Provides 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.
.claude/skills/giuseppe-trisciuoglio-aws-sdk-java-v2-messaging/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 97% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 68% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 58% | 0% |
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.
Dependencies:
xml<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sqs</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sns</artifactId> </dependency>
Client Configuration:
javaSqsClient sqsClient = SqsClient.builder() .region(Region.US_EAST_1) .credentialsProvider(DefaultCredentialsProvider.create()) .build(); SnsClient snsClient = SnsClient.builder() .region(Region.US_EAST_1) .build();
Create and Send Message:
javaString queueUrl = sqsClient.createQueue(CreateQueueRequest.builder() .queueName("my-queue") .build()).queueUrl(); String messageId = sqsClient.sendMessage(SendMessageRequest.builder() .queueUrl(queueUrl) .messageBody("Hello, SQS!") .build()).messageId();
Receive and Delete Message:
javaReceiveMessageResponse response = sqsClient.receiveMessage(ReceiveMessageRequest.builder() .queueUrl(queueUrl) .maxNumberOfMessages(10) .waitTimeSeconds(20) .build()); response.messages().forEach(message -> { processMessage(message.body()); sqsClient.deleteMessage(DeleteMessageRequest.builder() .queueUrl(queueUrl) .receiptHandle(message.receiptHandle()) .build()); });
FIFO Queue:
javaMap<QueueAttributeName, String> attributes = Map.of( QueueAttributeName.FIFO_QUEUE, "true", QueueAttributeName.CONTENT_BASED_DEDUPLICATION, "true" ); String fifoQueueUrl = sqsClient.createQueue(CreateQueueRequest.builder() .queueName("my-queue.fifo") .attributes(attributes) .build()).queueUrl(); sqsClient.sendMessage(SendMessageRequest.builder() .queueUrl(fifoQueueUrl) .messageBody("Order #12345") .messageGroupId("orders") .messageDeduplicationId(UUID.randomUUID().toString()) .build());
Create Topic and Publish:
javaString topicArn = snsClient.createTopic(CreateTopicRequest.builder() .name("my-topic") .build()).topicArn(); snsClient.publish(PublishRequest.builder() .topicArn(topicArn) .subject("Test Notification") .message("Hello, SNS!") .build());
SNS to SQS Subscription:
javaString queueArn = sqsClient.getQueueAttributes(GetQueueAttributesRequest.builder() .queueUrl(queueUrl) .attributeNames(QueueAttributeName.QUEUE_ARN) .build()).attributes().get(QueueAttributeName.QUEUE_ARN); snsClient.subscribe(SubscribeRequest.builder() .protocol("sqs") .endpoint(queueArn) .topicArn(topicArn) .build());
java@Service @RequiredArgsConstructor public class OrderNotificationService { private final SnsClient snsClient; private final ObjectMapper objectMapper; @Value("${aws.sns.order-topic-arn}") private String orderTopicArn; public void sendOrderNotification(Order order) throws JsonProcessingException { snsClient.publish(PublishRequest.builder() .topicArn(orderTopicArn) .subject("New Order Received") .message(objectMapper.writeValueAsString(order)) .messageAttributes(Map.of( "orderType", MessageAttributeValue.builder() .dataType("String") .stringValue(order.getType()) .build())) .build()); } }
messageId is returnedwaitTimeSeconds: 20)redrivePolicyNumberOfMessagesSent metricValidation Checklist:
java// After send if (messageId == null || messageId.isEmpty()) { throw new MessagingException("Message send failed - no messageId returned"); } // After receive if (response.messages().isEmpty()) { log.debug("No messages available - normal with long polling"); } // After delete if (!deleteResponse.sdkHttpResponse().isSuccessful()) { throw new MessagingException("Message deletion failed"); }
bashexport AWS_ACCESS_KEY_ID=your-access-key export AWS_SECRET_ACCESS_KEY=your-secret-key export AWS_REGION=us-east-1
ApproximateNumberOfMessages, NumberOfMessagesSent, NumberOfMessagesReceivedsoftware.amazon.awssdk at DEBUG levelSQS:
redrivePolicy) for failed messagesSNS:
NumberOfNotificationFailed metricGeneral:
.fifo suffix| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 16,475 | 13,734 | -17% | 1 | 1 | 0% | 3,273 | 4,663 | +42% | 0 | 0 | — |
case-07 | pass→pass | 14,709 | 14,659 | -0% | 1 | 1 | 0% | 2,850 | 4,589 | +61% | 0 | 0 | — |
case-08 | fail→pass | 9,014 | 8,555 | -5% | 1 | 1 | 0% | 1,717 | 3,384 | +97% | 0 | 0 | — |
case-02 | pass→pass | 9,638 | 6,576 | -32% | 1 | 1 | 0% | 1,761 | 2,945 | +67% | 0 | 0 | — |
case-03 | fail→pass | 16,456 | 16,656 | +1% | 1 | 1 | 0% | 2,950 | 4,955 | +68% | 0 | 0 | — |
case-04 | pass→pass | 9,673 | 8,544 | -12% | 1 | 1 | 0% | 1,990 | 3,489 | +75% | 0 | 0 | — |
case-05 | pass→pass | 11,301 | 10,546 | -7% | 1 | 1 | 0% | 2,247 | 3,607 | +61% | 0 | 0 | — |
case-06 | fail→pass | 22,787 | 10,585 | -54% | 1 | 1 | 0% | 3,093 | 3,855 | +25% | 0 | 0 | — |
case-09 | pass→pass | 18,937 | 15,341 | -19% | 1 | 1 | 0% | 3,398 | 4,746 | +40% | 0 | 0 | — |
case-10 | fail→fail | 14,200 | 13,107 | -8% | 1 | 1 | 0% | 2,658 | 4,210 | +58% | 0 | 0 | — |
case-11 | pass→pass | 7,429 | 5,536 | -25% | 1 | 1 | 0% | 1,444 | 2,877 | +99% | 0 | 0 | — |
case-12 | fail→pass | 16,034 | 14,148 | -12% | 1 | 1 | 0% | 2,954 | 4,679 | +58% | 0 | 0 | — |
case-13 | fail→pass | 13,970 | 16,864 | +21% | 1 | 1 | 0% | 2,225 | 4,159 | +87% | 0 | 0 | — |
case-14 | pass→pass | 5,466 | 3,183 | -42% | 1 | 1 | 0% | 1,130 | 2,389 | +111% | 0 | 0 | — |
case-15 | fail→pass | 10,748 | 8,942 | -17% | 1 | 1 | 0% | 1,778 | 3,267 | +84% | 0 | 0 | — |
case-16 | pass→pass | 9,805 | 8,866 | -10% | 1 | 1 | 0% | 1,600 | 3,382 | +111% | 0 | 0 | — |
case-17 | pass→pass | 11,461 | 8,770 | -23% | 1 | 1 | 0% | 1,856 | 3,237 | +74% | 0 | 0 | — |
case-18 | pass→fail | 19,291 | 15,277 | -21% | 1 | 1 | 0% | 2,214 | 4,594 | +107% | 0 | 0 | — |
case-19 | pass→pass | 13,093 | 11,788 | -10% | 1 | 1 | 0% | 2,157 | 3,896 | +81% | 0 | 0 | — |
case-20 | pass→pass | 15,737 | 10,685 | -32% | 1 | 1 | 0% | 3,134 | 4,097 | +31% | 0 | 0 | — |
case-21 | pass→pass | 11,443 | 13,987 | +22% | 1 | 1 | 0% | 2,176 | 4,343 | +100% | 0 | 0 | — |
case-22 | pass→pass | 14,538 | 12,800 | -12% | 1 | 1 | 0% | 2,594 | 4,362 | +68% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.