/** * Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with * the License. A copy of the License is located at * * http://aws.amazon.com/apache2.0/ * * or in the "LICENSE" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ package awslabs.lab31; import java.util.Date; import java.util.List; import java.util.Map.Entry; import awslabs.labutility.LabUtility; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import com.amazonaws.services.sns.AmazonSNSClient; import com.amazonaws.services.sqs.AmazonSQSClient; import com.amazonaws.services.sqs.model.Message; import com.amazonaws.services.sqs.model.QueueDeletedRecentlyException; /** * Project: Lab3.1 */ public class Lab31 { // TODO: Select the region containing the table that you are using. private static Region region = Region.getRegion(Regions.US_EAST_1); // BEGIN NON-STUDENT CODE private static ILabCode labCode = new StudentCode(); private static IOptionalLabCode optionalLabCode = new StudentCode(); public static void main(String[] args) { try { // Create an SQS client AmazonSQSClient sqsClient = new AmazonSQSClient(new ClasspathPropertiesFileCredentialsProvider()); sqsClient.setRegion(region); // Create an SNS client AmazonSNSClient snsClient = new AmazonSNSClient(new ClasspathPropertiesFileCredentialsProvider()); snsClient.setRegion(region); String queueName = "Notifications"; String topicName = "ClassroomEvent"; // Creating the queue will fail if we've just deleted it and are recreating it // which is a possibility if you're tracking down a code error. If that happens, // pause and retry for up to a minute. System.out.println("Creating " + queueName + " queue."); Boolean retry = true, notified = false; // Create a timeout for 60-seconds from now. Date timeout = new Date(System.currentTimeMillis() + 60000L); String queueUrl = ""; while (retry) { try { queueUrl = labCode.createQueue(sqsClient, queueName); retry = false; } catch (QueueDeletedRecentlyException ex) { if (new Date().before(timeout)) { if (!notified) { System.out .println("The attempt to recreate the queue failed because the queue was deleted too"); System.out.println("recently. Waiting and retrying for up to 1 minute."); notified = true; } // Timeout hasn't expired yet, so wait and retry in 5 seconds. System.out.print("."); Thread.sleep(5000); } else { System.out.println("Retry timeout expired. Aborting."); throw ex; } } } if (notified) { System.out.println("Recovered."); } System.out.println("URL for new queue: " + queueUrl); // List SQS queues System.out.println("Getting ARN for " + queueName + " queue."); String queueArn = labCode.getQueueArn(sqsClient, queueUrl); System.out.println("ARN for queue: " + queueArn); // Create an SNS topic and get ARN System.out.println("Creating " + topicName + " topic."); String topicArn = labCode.createTopic(snsClient, topicName); System.out.println("New topic ARN: " + topicArn); System.out.println("Granting the notification topic permission to post in the queue."); optionalLabCode.grantNotificationPermission(sqsClient, queueArn, queueUrl, topicArn); System.out.println("Permission granted."); // Create an SNS subscription System.out.println("Creating SNS subscription."); labCode.createSubscription(snsClient, queueArn, topicArn); System.out.println("Subscription created."); // Publish message to topic String messageText = "This is the SNS topic notification body."; String messageSubject = "SNSTopicNotification"; System.out.println("Publishing SNS topic notification."); labCode.publishTopicMessage(snsClient, topicArn, messageSubject, messageText); System.out.println("Notification published."); // Send a message to the "Notifications" queue messageText = "This is the message posted to the queue directly."; System.out.println("Posting message to queue directly."); labCode.postToQueue(sqsClient, queueUrl, messageText); System.out.println("Message posted."); // Read message from queue System.out.println("Reading messages from queue."); List<Message> messages = labCode.readMessages(sqsClient, queueUrl); // We expect two messages here if (messages.size() < 2) { // Try to read again and see if we've picked up the missing message(s). messages.addAll(labCode.readMessages(sqsClient, queueUrl)); if (messages.size() < 2) { System.out.println(">>WARNING<< We didn't receive the expected number of messages. Investigate."); } else { System.out.println(); System.out.println("============================================================================"); System.out.println("PROBLEM: ReadMessages() had to be called twice to collect all the messages."); System.out.println(" Did you remember to set the MaxNumberOfMessages property in the "); System.out.println(" ReceiveMessageRequest object?"); System.out.println("============================================================================"); System.out.println(); } } PrintAndRemoveMessagesInResponse(sqsClient, messages, queueUrl); // Locate and delete the SNS subscription System.out.println("Removing provisioned resources."); labCode.deleteSubscriptions(snsClient, topicArn); System.out.println("Subscriptions removed."); // Delete the SNS Topic labCode.deleteTopic(snsClient, topicArn); System.out.println("Topic deleted."); // Locate the previously created queue and delete labCode.deleteQueue(sqsClient, queueUrl); System.out.println("Queue deleted."); } catch (Exception ex) { LabUtility.dumpError(ex); } } // Print the message contents to the console window private static void PrintAndRemoveMessagesInResponse(AmazonSQSClient sqsClient, List<Message> messages, String queueUrl) { for (Message message : messages) { System.out.println("\nQueue Message:"); System.out.println("\tMessageId : " + message.getMessageId()); System.out.println("\tMD5OfBody : " + message.getMD5OfBody()); System.out.println("\tBody : " + message.getBody()); if (message.getAttributes().size() > 0) { System.out.println("\tMessage Attributes"); for (Entry<String, String> entry : message.getAttributes().entrySet()) { System.out.println("\t\t" + entry.getKey() + " : " + entry.getValue()); } } System.out.println("\nDeleting message."); labCode.removeMessage(sqsClient, queueUrl, message.getReceiptHandle()); System.out.println("Message deleted."); } } // END NON-STUDENT CODE }