使用Java使用Amazon Simple Queue Service
Amazon Simple Queue Service或SQS是Amazon Webservice堆棧提供的高度可擴展的托管消息隊列。 Amazon SQS可用于完全解耦系統(tǒng)中不同組件的操作,這些組件否則將交換數(shù)據(jù)以執(zhí)行獨立的任務。 Amazon SQS還可以幫助我們保存在應用程序關(guān)閉或組件之一不可用時丟失的數(shù)據(jù)。
Amazon SQS功能(直接從亞馬遜網(wǎng)站復制)
有了以上知識,讓我們嘗試使用SQS創(chuàng)建簡單的照片處理服務。
本教程的問題定義
我們將創(chuàng)建一個包含以下組件的簡單照片處理應用程序。
在開始之前,如果您通過以下鏈接觀看視頻,那就太好了: http : //docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/Welcome.html
入門步驟
Maven用戶可以在其POM中添加以下依賴項
<dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk</artifactId><version>1.3.33</version> </dependency>創(chuàng)建一個名為“ AwsCredentials.properties”的文件,將其存儲在您的項目中。 該文件將包含以下屬性
accessKey = secretKey =這些屬性的值是您在步驟6中生成的訪問密鑰。
現(xiàn)在,我們準備搖擺不定,并通過一些代碼使我們的手變得骯臟。
AWSSimpleQueueServiceUtil.java
package com.aranin.adconnect.util.aws;import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.AmazonSQSClient; import com.amazonaws.services.sqs.model.*;import java.io.FileInputStream; import java.util.List; import java.util.Properties;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/19/13* Time: 10:44 AM* To change this template use File | Settings | File Templates.*/ public class AWSSimpleQueueServiceUtil {private BasicAWSCredentials credentials;private AmazonSQS sqs;private String simpleQueue = "PhotoQueue";private static volatile AWSSimpleQueueServiceUtil awssqsUtil = new AWSSimpleQueueServiceUtil();/*** instantiates a AmazonSQSClient http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/AmazonSQSClient.html* Currently using BasicAWSCredentials to pass on the credentials.* For SQS you need to set your regions endpoint for sqs.*/private AWSSimpleQueueServiceUtil(){try{Properties properties = new Properties();properties.load(new FileInputStream("D:/samayik/adkonnection/src/main/resources/AwsCredentials.properties"));this.credentials = new BasicAWSCredentials(properties.getProperty("accessKey"),properties.getProperty("secretKey"));this.simpleQueue = "PhotoQueue";this.sqs = new AmazonSQSClient(this.credentials);/*** My queue is in singapore region which has following endpoint for sqs* https://sqs.ap-southeast-1.amazonaws.com* you can find your endpoints here* http://docs.aws.amazon.com/general/latest/gr/rande.html** Overrides the default endpoint for this client ("sqs.us-east-1.amazonaws.com")*/this.sqs.setEndpoint("https://sqs.ap-southeast-1.amazonaws.com");/**You can use this in your web app where AwsCredentials.properties is stored in web-inf/classes*///AmazonSQS sqs = new AmazonSQSClient(new ClasspathPropertiesFileCredentialsProvider());}catch(Exception e){System.out.println("exception while creating awss3client : " + e);}}public static AWSSimpleQueueServiceUtil getInstance(){return awssqsUtil;}public AmazonSQS getAWSSQSClient(){return awssqsUtil.sqs;}public String getQueueName(){return awssqsUtil.simpleQueue;}/*** Creates a queue in your region and returns the url of the queue* @param queueName* @return*/public String createQueue(String queueName){CreateQueueRequest createQueueRequest = new CreateQueueRequest(queueName);String queueUrl = this.sqs.createQueue(createQueueRequest).getQueueUrl();return queueUrl;}/*** returns the queueurl for for sqs queue if you pass in a name* @param queueName* @return*/public String getQueueUrl(String queueName){GetQueueUrlRequest getQueueUrlRequest = new GetQueueUrlRequest(queueName);return this.sqs.getQueueUrl(getQueueUrlRequest).getQueueUrl();}/*** lists all your queue.* @return*/public ListQueuesResult listQueues(){return this.sqs.listQueues();}/*** send a single message to your sqs queue* @param queueUrl* @param message*/public void sendMessageToQueue(String queueUrl, String message){SendMessageResult messageResult = this.sqs.sendMessage(new SendMessageRequest(queueUrl, message));System.out.println(messageResult.toString());}/*** gets messages from your queue* @param queueUrl* @return*/public List<Message> getMessagesFromQueue(String queueUrl){ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();return messages;}/*** deletes a single message from your queue.* @param queueUrl* @param message*/public void deleteMessageFromQueue(String queueUrl, Message message){String messageRecieptHandle = message.getReceiptHandle();System.out.println("message deleted : " + message.getBody() + "." + message.getReceiptHandle());sqs.deleteMessage(new DeleteMessageRequest(queueUrl, messageRecieptHandle));}public static void main(String[] args){}}PhotoProcessor.java
package com.aranin.adconnect.util.aws;import org.imgscalr.Scalr;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/19/13* Time: 12:32 PM* To change this template use File | Settings | File Templates.*/ public class PhotoProcessor {public static void generateImage(String imagePath, String origName, String targetName, int scalabity){String origImage = null;String targetImage = null;File origFile = null;BufferedImage buffImg = null;File targetFile = null;try{origImage = imagePath + "/" + origName;targetImage = imagePath + "/" + targetName;origFile = new File(origImage);buffImg = ImageIO.read(origFile);buffImg = Scalr.resize(buffImg, Scalr.Method.SPEED, scalabity);targetFile = new File(targetImage);ImageIO.write(buffImg, "jpeg", targetFile);}catch (Exception e){System.out.println("Exception in processing image : " + e);}finally {buffImg = null;}} }PhotoFile.java
package com.aranin.adconnect.util.aws;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/19/13* Time: 12:29 PM* To change this template use File | Settings | File Templates.*/ public class PhotoFile {private String origName;private String targetName;public String imagePath;public String getOrigName() {return origName;}public void setOrigName(String origName) {this.origName = origName;}public String getTargetName() {return targetName;}public void setTargetName(String targetName) {this.targetName = targetName;}public String getImagePath() {return imagePath;}public void setImagePath(String imagePath) {this.imagePath = imagePath;}public String toString(){return origName + "," + targetName + "," + imagePath;} }SQSPhotoManager.java
package com.aranin.adconnect.util.aws;import com.amazonaws.services.sqs.model.Message;import java.util.List; import java.util.StringTokenizer;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/20/13* Time: 11:38 AM* To change this template use File | Settings | File Templates.*/ public class SQSPhotoManager implements Runnable{private String queueUrl;public static void main(String[] args){AWSSimpleQueueServiceUtil awssqsUtil = AWSSimpleQueueServiceUtil.getInstance();/*** 1. get the url for your photo queue*/String queueUrl = awssqsUtil.getQueueUrl(awssqsUtil.getQueueName());System.out.println("queueUrl : " + queueUrl);/*** 2. Add a photo to the queue to be processed*/PhotoFile photo = new PhotoFile();photo.setImagePath("C:/Users/Public/Pictures/Sample Pictures");photo.setOrigName("Tree.jpg");photo.setTargetName("Tree_thumb.jpg");/*** 3. set the photofile in queue for processing*/awssqsUtil.sendMessageToQueue(queueUrl, photo.toString());/*** get the messages from queue*/Thread managerthread = new Thread(new SQSPhotoManager(queueUrl),"T2");managerthread.start();}public SQSPhotoManager(String queueUrl){this.queueUrl = queueUrl;}@Overridepublic void run() {AWSSimpleQueueServiceUtil awssqsUtil = AWSSimpleQueueServiceUtil.getInstance();boolean flag = true;while(flag){List<Message> messages = awssqsUtil.getMessagesFromQueue(this.queueUrl);if(messages == null || messages.size() == 0){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.}}else{flag = false;for (Message message : messages) {String messagePhoto = message.getBody();System.out.println("photo to be processed : " + messagePhoto);StringTokenizer photoTokenizer = new StringTokenizer(messagePhoto,",");String source = null;String target = null;String path = null;source = photoTokenizer.nextToken();target = photoTokenizer.nextToken();path = photoTokenizer.nextToken();System.out.println("source : " + source);System.out.println("target : " + target);System.out.println("path : " + path);/*** generate thumbmail within 150*150 container*/PhotoProcessor.generateImage(path, source, target, 150);}/*** finally delete the message*/for (Message message : messages) {awssqsUtil.deleteMessageFromQueue(this.queueUrl, message);}}}} } 這將構(gòu)成使用SQS的PhotoProcessor應用程序的核心。 此代碼有一個明顯的缺點。 它使用線程對SQS進行輪詢,如果您可以在代碼中創(chuàng)建一個偵聽器來訂閱隊列并在收到新消息時采取必要的措施,那將是很好的選擇。 這確實是我下一篇文章的主題。 然后,隨時向我提問,我們可以共同找到答案。
翻譯自: https://www.javacodegeeks.com/2013/06/working-with-amazon-simple-queue-service-using-java.html
總結(jié)
以上是生活随笔為你收集整理的使用Java使用Amazon Simple Queue Service的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 意外险备案登记需要什么材料(意外险备案)
- 下一篇: linux网卡查看命令(linux 网卡