使用Java使用Amazon Simple Queue Service

Amazon Simple Queue Service或SQS是Amazon Webservice堆栈提供的高度可扩展的托管消息队列。 Amazon SQS可用于完全解耦系统中不同组件的操作,这些组件否则将交换数据以执行独立的任务。 Amazon SQS还可以帮助我们保存在应用程序关闭或组件之一不可用时丢失的数据。

Amazon SQS功能(直接从亚马逊网站复制)

  1. 冗余基础结构 -保证至少一次传递消息,对消息的高度并发访问以及发送和检索消息的高可用性
  2. 多位作者和读者-系统的多个部分可以同时发送或接收消息。 SQS在处理期间锁定消息,以防止系统的其他部分同时处理消息。
  3. 每个队列的可配置设置 -您的所有队列不必完全相同。 例如,一个队列可以针对需要比其他队列更长的处理时间的消息进行优化。
  4. 可变的消息大小 -您的消息最大为65536字节(64 KiB)。 对于更大的消息,您可以使用Amazon Simple Storage Service(Amazon S3)或Amazon SimpleDB存储消息的内容,并使用Amazon SQS持有指向Amazon S3或Amazon SDB对象的指针。 或者,您可以将较大的消息拆分为较小的消息。
  5. 访问控制 -您可以控制谁可以向队列发送消息,以及谁可以从队列接收消息
  6. 延迟队列 -延迟队列是用户在队列上设置默认延迟的延迟队列,以便所有排队的消息的发送将被延迟该时间段。 您可以使用CreateQueue创建队列时设置延迟值,也可以使用SetQueueAttributes更新该值。 如果更新该值,则新值仅影响更新后排队的消息。

有了以上知识,让我们尝试使用SQS创建简单的照片处理服务。

本教程的问题定义

我们将创建一个包含以下组件的简单照片处理应用程序。

  1. Photo Uploader serivce –这是一项网络服务,允许用户将照片上传到系统。 照片上传后,它们将存储在临时存储中。 为了简单起见,我们假设用户已经上传了照片并将其存储在预定义的位置。
  2. AWSSimpleQueueServiceUtil –这是一个实用程序类,用于包装Amazon SQS客户端并在SQS队列上执行基本的CRUD操作。
  3. PhotoProcessingManager –管理整个节目。 它将调用AWSSimpleQueueServiceUtil将消息发送/接收到SQS,并调用PhotoProcessor处理照片,最后从队列中删除消息。 通常,我们应该打算让此类充当SQS的侦听器,但为简单起见,我们仅使用轮询机制从SQS中提取消息。
  4. PhotoProcessor –通过PhotoProcessingManager从SQS获取照片消息并生成缩略图。

在开始之前,如果您通过以下链接观看视频,那就太好了: http : //docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/Welcome.html

入门步骤

  1. 创建一个亚马逊帐户。 您将需要一张信用卡
  2. 登录到控制台console.aws.amazon.com 。
  3. 在控制台仪表板上搜索SQS,然后单击它。 它会将您带到您的SQS家。
  4. 创建一个新的SQS队列,并将其命名为PhotoQueue。 将其余设置保留为默认设置。 我们还可以动态创建和删除SQS队列,但是在本教程中,我有一个预先创建的队列,该队列将在我的代码中使用。
  5. 现在我们有了一个队列,现在我们将在我们最喜欢的Java编辑器中创建一个简单的Java项目,并了解如何利用此队列。
  6. 完成后,您需要下载安全凭证。 为此,请转到“我的帐户” /“安全凭证”。 我们追求的是访问凭据。 您将看到有3种类型的访问凭据,其中之一是“访问密钥”。 我们需要它来访问和使用刚刚创建的PhotoQueue。 我们将创建一组新的访问密钥,并将访问密钥和秘密密钥存储在安全的位置。
  7. 现在,从此处下载适用于Java的SDK。 http://aws.amazon.com/sdkforjava 。 在sdk的lib文件夹中,将aws-java-sdk-1.3.33.jar复制到您的项目类路径。

    Maven用户可以在其POM中添加以下依赖项

    <dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk</artifactId><version>1.3.33</version>
    </dependency>

    创建一个名为“ AwsCredentials.properties”的文件,将其存储在您的项目中。 该文件将包含以下属性

    accessKey =
    secretKey =

    这些属性的值是您在步骤6中生成的访问密钥。

  8. 对于照片处理,我正在使用imgscalr 。 它是Java中的一个轻量级且很棒的照片处理库,用于执行简单的任务,例如调整大小,旋转,裁剪等。您可以从http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library下载该jar /#download 。 Maven用户可以将以下内容添加到其依赖项列表中。
    <dependency><groupId>org.imgscalr</groupId><artifactId>imgscalr-lib</artifactId><version>4.2</version><type>jar</type><scope>compile</scope></dependency>

现在,我们准备摇摆不定,并通过一些代码使我们的手变得肮脏。

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);}}}}
}

这将构成使用SQS的PhotoProcessor应用程序的核心。 此代码有一个明显的缺点。 它使用线程对SQS进行轮询,如果您可以在代码中创建一个侦听器来订阅队列并在收到新消息时采取必要的措施,那将是很好的选择。 这确实是我下一篇文章的主题。 然后,随时向我提问,我们可以共同找到答案。

参考: Weblog4j博客上的JCG合作伙伴 Niraj Singh 使用Java使用Amazon Simple Queue Service 。

翻译自: https://www.javacodegeeks.com/2013/06/working-with-amazon-simple-queue-service-using-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机三种引用方式,单元格的引用方式有哪几种

EXCEL单元格的引用包括绝对引用、相对引用和混合引用三种。单元格引用是Excel中的术语&#xff0c;指用单元格在表中的坐标位置的标识。是计算机基础的重要学习内容。1、绝对引用&#xff1a;单元格中的绝对单元格引用(例如$F$6)总是在指定位置引用单元格F6。如果公式所在单元格…

HTML5标签用法及描述

2000 年底&#xff0c;国际 W 3C 织组织公布发行了 X HTML 1.0 版本&#xff0c;到现在已经有 10 年了。这 10 年里&#xff0c; Web 飞速发展&#xff0c;X HTML 1.0 显得“力不从心”&#xff0c;已经跟不上时代的发展了&#xff0c;于是 HTML 5 孕育而生。 W 3C 在 201…

什么是作用域链?

1、简单说就是作用域集合 当前作用域 -> 父级作用域 -> ... -> 全局作用域 形成的作用域链条全局作用域的变量和方法都可以进行调用局部的变量和方法只能局部进行调用( 除闭包外 )局部可以访问全局的变量和方法转载于:https://www.cnblogs.com/wangfencs/p/9446293…

2018 国内 DevOps 趋势分析与实践分享

2017 年年末&#xff0c;《中国第一份 DevOps 年度调查报告》发布&#xff0c;这对国内一直摸着石头过河的 DevOps 先行者和 DevOps 在中国的发展都有着里程碑式的意义。它使国内的 DevOps 先行实践者们既能够对自身的 DevOps 实践有明确定位&#xff0c;又为踌躇不前的观望者们…

linux上php指向mysql_linux环境下 php如何配置mysql

展开全部Linux下配置安装PHP环境参考别人的做法,遇到问题上网查,下面就是安装步骤.一、安装Apache2.2.221、到官网下636f707962616964757a686964616f31333339666133载 http://httpd.apache.org/download.cgi2、解压tar -zxvf httpd-2.2.22.tar.gz3、建立目标文件夹(注意以下所有…

Java 7 Swing:创建半透明和成形的Windows

Java 7 Swing支持具有透明和非矩形形状的窗口。 以下屏幕截图显示了创建的不透明度为75&#xff05;的圆形窗口。 您可以通过在JFrame上使用setOpacity方法更改其不透明度来创建半透明窗口。 请注意&#xff0c;只有底层操作系统支持时&#xff0c;您才能创建半透明窗口。 另外…

ajax用post方法,jquery中get,post和ajax方法的使用小结

在JQuery中可以使用get&#xff0c;post和ajax方法给服务器端传递数据get方法的使用(customForGet.js文件)&#xff1a;function verify(){//1.获取文本框的数据//通过DOM的方式获取//document.getElementByIdx("userName");//通过JQuery的方式获取var jqueryObj $(…

vim使用手册

https://www.cnblogs.com/lijia0511/p/5644566.html转载于:https://www.cnblogs.com/kusy/p/9450311.html

JAVASCRIPT常用20种小技巧汇总

1.TEXTAREA自适应文字行数的多少 2.脚本永不出错<script LANGUAGE"javascript"></script>3.ENTER键可以让光标移到下一个输入框4.预定秒数内自动转到指定网址5.怎么改变滚动条的颜色&#xff0c;只有ie5.5版本以上才能支持。 这是使用CSS语言&#xff0c…

JavaWeb之动态页面技术JSP/EL/JSTL

一、JSP技术 1&#xff0e;jsp脚本和注释 jsp脚本&#xff1a; 1&#xff09;<%java代码%> ----- 内部的java代码翻译到service方法的内部 2&#xff09;<%java变量或表达式> ----- 会被翻译成service方法内部out.print() 3&#xff09;<%!java代码%> ---- 会…

mac mysql创建本地数据库_【mac】配置本地数据库

1.【安装数据库】brew 安装mysql -- brew install mysql安装成功后在命令行敲入 which mysql 查看安装路径2.【配置数据库】如果直接打mysql会报错&#xff0c;需要将mysql添加到环境变量&#xff0c;具体方法参阅后台学习-环境变量检查mysql是否启动 ps -ef | grep mysqld开启…

Spring Integration关键案例与现实生活场景

这篇文章将总结Spring Integration&#xff08;SI&#xff09;的重要要点以及消息传递集成模式。 对于每个关键提示&#xff0c;我都会根据我的经验添加一个真实的示例。 分离器 一个。 它能做什么&#xff1f; 拆分器实际上是一种模式&#xff0c;它在某一点接收一条消息并将…

ie下按keydown事件会触发button

负责公司的一个b2c平台&#xff0c;头部那里有个搜索查询的功能&#xff0c;根据用户输入的内容按回车键也会跳转到响应的页面&#xff0c;后来在ie浏览器下惊奇的发现按回车键的同时它也会触发底部的邮箱订阅的button事件&#xff0c;开始以为是其它的地方用到了回车键从而冲突…

BZOJ3771 Triple(FFT+容斥原理)

思路比较直观。设A(x)Σxai。先把只选一种的统计进去。然后考虑选两种&#xff0c;这个直接A(x)自己卷起来就好了&#xff0c;要去掉选同一种的情况然后除以2。现在得到了选两种的每种权值的方案数&#xff0c;再把这个卷上A(x)。得到这个后考虑去重&#xff0c;其中重复的就是…

糖豆人维修服务器多长时间,服务器不稳定的《糖豆人》凭啥还这么火?只因做到了这三点...

8月4日&#xff0c;《糖豆人&#xff1a;终极淘汰赛》在steam平台上线&#xff0c;不到一周的时间直接登上steam畅销榜第六位。这款看起来似乎并不具备3A制作级别的游戏&#xff0c;到底是怎么获得了这么多玩家的追捧和青睐的呢&#xff1f;不妨跟着汇智妹一起看看这款游戏到底…

MapReduce算法–了解数据联接第1部分

在本文中&#xff0c;我们继续执行一系列实现算法的系列&#xff0c;该算法在使用MapReduce进行数据密集型文本处理中找到&#xff0c;这一次讨论数据联接。 虽然我们将讨论在Hadoop中联接数据的技术并提供示例代码&#xff0c;但在大多数情况下&#xff0c;您可能不会自己编写…

移动端Web开发小记

之前为公司商旅频道写移动端的页面时遇到不少问题&#xff0c;今特来个总结&#xff0c;希望能为后来者带来一些帮助。 不再考虑浏览器兼容性 移动端开发主要对象是手持设备&#xff0c;其中绝大部分是IOS和Android系统&#xff0c;so&#xff0c;在开发此类页面时不必纠结IE…

虚拟机游戏获取服务器地址,vue获取服务器地址

vue获取服务器地址 内容精选换一换Atlas 500 Pro 智能边缘服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 500 Pro 智能边缘服务器 用户指南(型号 3000)》&#xff0c;安装操作系统完成后&#xff0c;配置业务网口IP地址&#xff0c;请参见配…

jar各个版本号的意义

jar版本号的意义&#xff1a; Alpha&#xff1a; Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用.是希腊字母的第一位,表示最初级的版本&#xff0c;alpha 就是α&#xff0c;beta 就是β &#xff0c;alpha 版就是比 beta 还早的测试版&a…

mysql用户及权限管理_MySQL 用户及权限管理

1.mysql用户的定义在mysql中&#xff0c;用户由用户名和主机域组成的。1.1 用户名的写法mysql> create user test1localhost;注意&#xff1a;用户名不要以数字、符号开头&#xff0c;如若一定要这么写&#xff0c;给用户名加上引号才能创建用户。1.2 用户中的主机域的写法单…