java queue使用_使用Java使用Amazon Simple Queue Service

java queue使用

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. 照片上传器服务 –这是一项网络服务,允许用户将照片上传到系统。 照片上传后,它们将存储在临时存储中。 为简单起见,我们假设用户已经上传了照片并将其存储在预定义的位置。
  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

java queue使用

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

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

相关文章

latex学习篇【一】论文中的图片技巧QA

第一篇论文总算收尾了&#xff0c;整理一波latex写论文的Q&A。 LATEX专栏第一篇&#xff1a;在Latex模板中引入各种图片的问题。 工具&#xff1a;overleaf网站&#xff1a;https://www.overleaf.com/project/60e9ceb20f8db14efa31dc80在overleaf上面插入图片什么形式最好…

配置HTTPS以与Servlet一起使用

要配置Java EE应用程序以通过HTTPS进行通信&#xff0c;需要在web.xml文件中使用几行XML。 web.xml文件位于项目的WEB-INF目录中&#xff0c;通常在IDE生成Java EE Web应用程序时自动创建。 如果不是&#xff0c;您可以自己创建它。 HTTPS的动机 为Web应用程序配置安全连接的…

LATEX学习篇【二】:论文中的公式技巧QA

写论文免不了写好多好多公式&#xff0c;众所周知啊latex的公式是很难编辑的&#xff0c;有没有简便一点的办法呢&#xff1f;有的&#xff0c;让我们继续读下去吧&#xff01; 写公式时会用到的一些奇奇怪怪的符号大全&#xff08;来自百度&#xff09; 2. 写公式好用的工具…

latex学习篇【三】论文中的表格技巧QA

latex中表格是一个大头 和公式一样&#xff0c;推荐一个好用的工具&#xff01; https://www.tablesgenerator.com/latex_tables 这个网站可以在线编辑表格&#xff0c;直接生成代码&#xff0c;粘贴过去就可以啦&#xff01;&#xff01;&#xff01; 但是关于细节还有很多要调…

JRebel适用于Gradle Spring Boot应用程序

关于如何将JRebel添加到使用Gradle作为构建工具的Spring Boot应用程序中&#xff0c;有一些文档 。 它是基本的&#xff0c;但是效果很好。 您所要做的就是在build.gradle中添加几行&#xff1a; if (project.hasProperty(rebelAgent)) {bootRun.jvmArgs rebelAgent }然后在…

MADDPG中环境怎么配置,multiagent包解决

一、环境提供 MADDPG&#xff1a; https://github.com/starry-sky6688/MADDPG (pytorch版本) MPE环境&#xff1a;https://github.com/openai/multiagent-particle-envs 论文&#xff1a;《Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments》https…

使用RabbitMQ的SpringBoot消息传递

RabbitMQ是流行的消息代理解决方案之一&#xff0c;并提供可用于各种编程语言的客户端库&#xff0c;包括Java&#xff0c;Scala&#xff0c;.NET&#xff0c;Go&#xff0c;Python&#xff0c;Ruby&#xff0c;PHP等。在本教程中&#xff0c;我们将学习如何使用RabbitMQ消息代…

1.0jpa 2.0_在JPA 2.1中使用@Convert正确完成映射枚举

1.0jpa 2.0如果您曾经在JPA中使用过Java枚举&#xff0c;那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择&#xff0c;但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择&#xff1a; 托肖夫达林 Enumerated(EnumType.ORDINAL…

Drools可执行模型还活着

总览 可执行模型的目的是提供规则集的纯基于Java的表示&#xff0c;以及方便的Java DSL以编程方式创建这种模型。 该模型是低级别的&#xff0c;旨在为用户提供所需的所有信息&#xff0c;例如用于索引评估的lambda。 这样可以使其保持快速运行&#xff0c;并避免在此级别上进行…

java ee cdi_Java EE CDI依赖注入(@Inject)教程

java ee cdi在本教程中&#xff0c;我们将向您展示如何在CDI管理的Bean中实现依赖注入。 特别是&#xff0c;我们将利用CDI API提供的Inject批注将CDI bean注入另一个bean。 通过这种方式&#xff0c;可以在应用程序&#xff08;例如JavaServer Faces应用程序&#xff09;中使用…

Java 8中的可重复注释

使用Java 8&#xff0c;您可以对声明或类型重复相同的注释。 例如&#xff0c;要注册一个类仅应由特定角色在运行时访问&#xff0c;则可以编写如下内容&#xff1a; Role("admin") Role("manager") public class AccountResource { }注意&#xff0c;现在…

java sax解析xml_在Java中使用DOM,SAX和StAX解析器解析XML

java sax解析xml我碰巧通读了有关Java中XML解析和构建API的章节。 我试用了样本XML上的其他解析器。 然后&#xff0c;我想在我的博客上分享它&#xff0c;这样我就可以得到该代码的参考以及任何阅读此代码的参考。 在本文中&#xff0c;我将在不同的解析器中解析相同的XML&…

矩形脉冲信号的_IQ信号的解调学习

前面的文章学习了IQ的调制&#xff0c;本文主要讨论IQ的解调过程。调制波形回顾IQ的shifted DQPSK的调制波形总结如下。IQ的星图映射波形每个symbol有256个采样点&#xff0c;这里可以用单位脉冲或者矩形脉冲。如果只看256个symbol的话&#xff1a;IQ经过FIR滤波之后&#xff0…

Spring Data MongoDB教程

在当今世界&#xff0c;尽快启动并运行应用程序非常重要。 该应用程序还应该易于开发和维护。 Spring是这样的框架&#xff0c;它提供了与许多不同框架的集成的简便性&#xff0c;这使得使用Spring开发应用程序变得容易。 一种这样的集成是Spring与MongoDB的集成。 1.简介 在…

块内拉升lisp_求大神告知,如何用LISP实现块数量分类统计程序,最好统计后列出表格。谢谢了。...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个可以统计各种块的数量(基于块名)&#xff0c;但是不能生成表格。(prompt "\n命令为: BC ,用法如下: ")(prompt "\n先选择要统计的块,然后选择要统计的区域,结束后按F2显示出统计数量.");;;***************…

arm 交叉编译找不到so_嵌入式杂谈之交叉编译

这次扯一下嵌入式开发过程中经常用到的交叉编译器&#xff0c;虽说在之前的文章也提到过这个问题&#xff0c;不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来&#xff0c;慢慢的接受嵌入式Linux开发的一些约定俗成的工具与方法)&#xff…

Java 10将如何改变您的编码方式

突出显示Java 10中新的Java局部变量类型推断功能 早在2016年&#xff0c;Java社区就掀起了新的JDK增强提案&#xff08;JEP&#xff09;&#xff1a; JEP 286 。 现在&#xff0c;两年后&#xff0c;局部变量类型推断可以说是Java 10中最值得注意的功能。这是Java语言开发人员…

中兴zxr10路由器重启命令_蒲公英路由器刷第三方固件(一)

蒲公英路由器是由上海贝锐信息科技股份有限公司(oray)在2015年10月14日推出的一款路由器。它是一款采用VPC[3]技术实现智能组网的路由器。2台或多台使用&#xff0c;无需公网IP&#xff0c;能将异地局域网通过蒲公英组建成一个网络。这次刷固件的教程为蒲公英路由器x3/x3pro刷第…

还有更多REST技巧

在以前的博客文章中&#xff0c;我介绍了一些实现REST体系结构的想法和技巧。 在这篇文章中&#xff0c;我将介绍更多的想法和技巧。 快取 缓存是原始论文的很大一部分。 见5.1.4节 策略包括验证&#xff08; 客户端检查它是否具有最新版本 &#xff09;和到期&#xff08; 客…

javaml_一些基于Java的AI框架:Encog,JavaML,Weka

javaml在进行编程收集情报工作时&#xff0c;我发现自己花了很多时间将Python代码转换为Java&#xff0c;通常对我的进度缓慢感到不耐烦&#xff0c;所以我一直在寻找替代方法。 我发现3&#xff1a; Encog – Heaton研究 Java语言 威卡 这绝不是深入的研究&#xff0c;我…