aws sqs_在Spring中将AWS SQS用作JMS提供程序

aws sqs

最近AWS公布了新的客户端库,它实现了JMS 1.1规范 ,并使用他们的简单队列服务 (SQS)作为JMS提供者 (见杰夫·巴尔的帖子在这里 )。 在我的文章中,我将向您展示如何设置Maven项目以使用Spring Framework来使用该库。
我们将执行以下步骤:

  • 在AWS管理控制台中创建队列
  • 在机器上设置您的AWS凭证
  • 设置您的Maven项目
  • 创建Spring配置
  • 创建Java文件以产生和接收消息

这篇文章将仅显示SQS可能性的一些基本用法,但应该足以帮助您入门。 我假设您已经创建了AWS账户 ,并且熟悉Maven和基本的Spring设置。

在AWS管理控制台中创建队列

第一步是创建队列,以便我们可以在程序中使用它。 我向您展示了如何使用管理控制台创建队列,但是您也可以通过编程方式创建必要的队列。

当您转到管理控制台时,可以选择SQS页面,然后单击“创建新队列”按钮:

截图,于Mar-28-20-10-00

输入队列名称,并单击“创建队列”按钮以接受当前的默认设置:

screenshot-at-mar-28-20-10-59

在机器上设置您的AWS凭证

为了能够使用Java SDK访问您的AWS资料,最简单的方法是在用户的主目录中创建一个“ credentials.proeprties”文件。 在〜/ .aws / credentials(对于Windows用户为C:\ Users \ USER_NAME \ .aws \ credentials)处创建凭据文件,并在将大写的值替换为您自己的值之后保存以下行。

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

设置您的Maven项目

使用Maven设置项目时,可以将以下依赖项添加到pom中,以便能够在Spring 4中使用AWS SQS:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>net.pascalalma.aws</groupId><artifactId>sqs-client</artifactId><version>1.0-SNAPSHOT</version><properties><version.spring>4.1.5.RELEASE</version.spring></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${version.spring}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${version.spring}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${version.spring}</version></dependency><dependency><groupId>com.amazonaws</groupId><artifactId>amazon-sqs-java-messaging-lib</artifactId><version>1.0.0</version><type>jar</type></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies>
</project>

创建Spring配置

在第一个示例中,我将使用一个简单的MessageProducer和MessageConsumer类,其中,生产者将消息放入队列,而使用者将从队列中读取一条消息。 这是模型是下文称要通过AWS作为一个“同步”的呼叫。 Spring配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><context:component-scan base-package="net.pascalalma.aws.sqs"></context:component-scan><bean id="credentialsProviderBean" class="com.amazonaws.auth.DefaultAWSCredentialsProviderChain"/><bean id="connectionFactoryBuilder" class="com.amazon.sqs.javamessaging.SQSConnectionFactory$Builder"><property name="regionName" value="eu-west-1"/><property name="numberOfMessagesToPrefetch" value="5"/><property name="awsCredentialsProvider" ref="credentialsProviderBean"/></bean><bean id="connectionFactory" class="com.amazon.sqs.javamessaging.SQSConnectionFactory"factory-bean="connectionFactoryBuilder"factory-method="build"/><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory"/><property name="defaultDestinationName" ref="queueName"/></bean><bean id="queueName" class="java.lang.String"><constructor-arg value="DefaultDemoQueue"/></bean>
</beans>

创建Java文件以产生和接收消息

最后一步是创建必要的Java文件。 我认为它们足够简单且易于解释,因此我仅在此处显示源代码。 首先,我们有MessageProducer,它在执行消息时将消息放入队列中:

package net.pascalalma.aws.sqs;import org.apache.log4j.Logger;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;@Service("myMessageProviderService")
public class MyMessageProvider {final static Logger logger = Logger.getLogger(MyMessageProvider.class);@Resource(name = "jmsTemplate")private JmsTemplate jmsTemplate;public void sendMessage(final String txt) {logger.debug(String.format("Sending message with txt: %s", txt));jmsTemplate.send(new MessageCreator() {public Message createMessage(Session session) throws JMSException {final TextMessage msg = session.createTextMessage(txt);return msg;}});logger.debug("Message sent ");}
}

接下来是MessageConsumer,在此示例中,MessageConsumer在执行时仅从队列中读取一条消息:

package net.pascalalma.aws.sqs;import org.apache.log4j.Logger;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;@Service("myMessageConsumerService")
public class MyMessageConsumer {final static Logger logger = Logger.getLogger(MyMessageConsumer.class);@Resource(name = "jmsTemplate")private JmsTemplate jmsTemplate;public void readMessage() throws JMSException {logger.debug("Reading message");Message msg = jmsTemplate.receive();if (msg instanceof TextMessage) {TextMessage txtmsg = (TextMessage) msg;logger.info(String.format("Received text: %s", txtmsg.getText()));}logger.debug(msg.getClass());logger.info("Done");}
}

最后是Main类,它读取Spring配置并运行Producer和Consumer:

package net.pascalalma.aws.sqs;import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.jms.JMSException;public class SpringMain {final static Logger logger = Logger.getLogger(SpringMain.class);public static void main(String[] args) {//Build application context by reading spring-config.xmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"application-context.xml"});//Get an instance of ProductService class;MyMessageProvider prdSvc = (MyMessageProvider) ctx.getBean("myMessageProviderService");MyMessageConsumer conSvc = (MyMessageConsumer) ctx.getBean("myMessageConsumerService");//Call getProduct method of ProductServiceprdSvc.sendMessage("This is a test");try {conSvc.readMessage();} catch (JMSException e) {logger.error(e);}}
}

当运行Main类时,一切正常时,您将看到以下输出:

2015-03-29 10:26:39 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(28) - Sending message with txt: This is a test
2015-03-29 10:26:41 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(35) - Message sent 
2015-03-29 10:26:41 DEBUG net.pascalalma.aws.sqs.MyMessageConsumer(24) - Reading message
2015-03-29 10:26:41 INFO  net.pascalalma.aws.sqs.MyMessageConsumer(29) - Received text: This is a test
2015-03-29 10:26:41 DEBUG net.pascalalma.aws.sqs.MyMessageConsumer(32) - class com.amazon.sqs.javamessaging.message.SQSTextMessage
2015-03-29 10:26:41 INFO  net.pascalalma.aws.sqs.MyMessageConsumer(33) - DoneProcess finished with exit code 0

翻译自: https://www.javacodegeeks.com/2015/04/using-aws-sqs-as-jms-provider-with-spring.html

aws sqs

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

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

相关文章

openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断

编者注&#xff1a;单片机串口接收不定长数据时&#xff0c;必须面对的一个问题为&#xff1a;怎么判断这一包数据接收完成了呢&#xff1f;常见的方法主要有以下两种&#xff1a;1.在接收数据时启动一个定时器&#xff0c;在指定时间间隔内没有接收到新数据&#xff0c;认为数…

java 多线程性能_Java中多线程的性能比较

java 多线程性能Java中有多种用于多线程的技术。 可以通过同步关键字&#xff0c;锁或原子变量来并行化Java中的一段代码。 这篇文章将比较使用synced关键字ReentrantLock&#xff0c;getAndIncrement&#xff08;&#xff09;以及执行get&#xff08;&#xff09;和compareAnd…

C语言贪吃蛇小游戏 | 源码

点击蓝字关注我们该程序已经在VS2019上验证过了&#xff0c;可以直接运行。程序目录程序里就只有一个test.cpp文件&#xff0c;也就是说大家可以先创建工程&#xff0c;然后直运行效果C语言学习资源汇总【最新版】源码#include<stdio.h> #include<stdlib.h> #inclu…

东华大学计算机学院讲座单,计信学院成功举办2018级专业导师面对面系列讲座活动...

为帮助大一新生尽快适应大学生活&#xff0c;了解专业&#xff0c;掌握知识&#xff0c;计信学院积极响应学校号召&#xff0c;成立由教授、博士组成的专业导师团队&#xff0c;为各专业开展系列专业知识讲座。自10月17日晚7点至10月26日下午4点&#xff0c;各专业导师面对面系…

C函数指针别再停留在语法,得上升到软件设计

点击蓝字关注我们经常有朋友问到底如何在C程序中采用面向对象编程?如何让模块之间松耦合&#xff1f;......其实究其原因还是没有把C语言与软件设计很好的联系起来。这里跟大家找了一些内容&#xff0c;相信认真看完全文多多少少会有你想要的答案&#xff1a;正文部分&#xf…

spring默认缓存管理器_使用Spring的缓存管理器缓存Web内容

spring默认缓存管理器在这篇文章中&#xff0c;我想向大家展示如何使用Spring的CacheManager&#xff0c; Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识。 想象一下一个网上商店&#xff0c;它从远程WCMS&#xff08;Web内容管理系统&#xff09;获取一些内容&#…

计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...

原标题&#xff1a;大学值得选的“选修课”&#xff0c;一点不比专业课差&#xff0c;能选上最好认真听文/小哈你是怎样对待你的选修课的&#xff1f;以前经常听学长学姐们说过这样一句话&#xff0c;“上大学之后&#xff0c;专业课选逃&#xff0c;选修课必逃”。不知道大家是…

C/C++程序员的编程修养

点击蓝字关注我们什么是好的C/C程序员&#xff1f;是不是懂得很多技术细节&#xff1f;还是懂底层编程&#xff1f;还是编程速度比较快&#xff1f;我觉得都不是。对于一些技术细节来说和底层的技术&#xff0c;只要看帮助&#xff0c;查资料就能找到&#xff0c;对于速度快&am…

python账号密码一一对应_python模拟用户登录系统,如何两个用户输入各自的密码才能登入?...

展开全部 #我可以把我自己2113的成果送你&#xff0c;你来研究5261研究 import json #用来存储数据4102的模块 import os #用来进行文件操作1653 import sys #获取脚本所在目录用 import re #用来进行字符串操作 script_path os.path.realpath(__file__) PATH os.path.dirnam…

C语言#define与typedef的区别

点击蓝字关注我们在C语言编程中&#xff0c;typedef 和 #define是最常用语句&#xff0c;可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typedef的用法在C/C语言中&#xff0c;typedef常用来定义一个标识符及关键字的别名&#xff0c;它是语言编译过程的一部…

html文字添加波浪线,利用css渐变给文字下方加波浪线

具体代码如下.wavy-line-decoration {position: relative;line-height: 1.5em;}.wavy-line-decoration::before {content: ;position: absolute;bottom: -3px;width: 100%;height: 0.25em;background: // 可以给同一个元素同时添加多个背景渐变图层&#xff0c;用逗号隔开&…

新旧C++生成随机浮点数方法,你喜欢哪个?

点击蓝字关注我们一、在C11之前&#xff0c;我们通常采用rand函数来生成随机数。有时我们想用rand生成一组随机数&#xff0c;即使我们调用了srand&#xff0c;但生成的还是相同值。为什么会产生这种情况&#xff1f;又该如何解决&#xff1f;下面将用第一视角一起探究这其中的…

html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染

前言如图所示&#xff0c;webkit内核浏览器的渲染过程(解析HTML&#xff0c;构建DOM树&#xff0c;解析CSS&#xff0c;构建CSSOM树 &#xff0c;构建render树&#xff0c;布局layout&#xff0c;绘制painting)&#xff0c;这些过程理解起来可能有些抽象&#xff0c;今天我们一…

计算机进管理提示找不到入口,win10系统开机提示xxxdll模块已加载但找不到入口点的教程...

有关win10系统开机提示xxxdll模块已加载但找不到入口点的操作方法想必大家有所耳闻。但是能够对win10系统开机提示xxxdll模块已加载但找不到入口点进行实际操作的人却不多。其实解决win10系统开机提示xxxdll模块已加载但找不到入口点的问题也不是难事&#xff0c;小编这里提示两…

十大经典排序,你真的都会了吗?(源码详解)

点击蓝字关注我们一、前言&#xff1a;排序的概念排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…

jvm 架构_不可变的基础架构,热部署和JVM

jvm 架构您是否在生产中部署和取消部署基于JVM的应用程序&#xff08;无论JVM容器/无容器&#xff09;&#xff1f; 也就是说&#xff0c;当您拥有某个应用程序或服务的新版本时&#xff0c;是否通过“取消部署”和“热部署”该应用程序的新更新版本来更改正在运行的JVM&#x…

c语言默认参数_5.1 C++有默认参数的函数

点击上方“C语言入门到精通”&#xff0c;选择置顶第一时间关注程序猿身边的故事作者闫小林白天搬砖&#xff0c;晚上做梦。我有故事&#xff0c;你有酒么&#xff1f;C有默认参数的函数在函数调用时形参从实参获取值&#xff0c;因为实参的个数要和形参相同&#xff0c;但有时…

计算机组成原理唐朔飞课后答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...

计算机组成原理第六章部分课后题答案(唐朔飞版) 6.4 设机器数字‎长为8位(含1位符号‎位在内)&#xff0c;写出对应下‎列各真值的‎原码、补码和反码‎。 -13/64&#xff0c;29/128&#xff0c;100&#xff0c;-87 解&#xff1a;十进制数 二进制数 原 码 反 码 补 码 -13/64 …

jboss eap 7.0_是时候抛弃Java 7 – JBoss EAP 6.4了!

jboss eap 7.0这一周真是太棒了。 JBoss EAP 6.4已发布&#xff0c;在众多技术增强和新功能中 &#xff0c;最大的是&#xff1a;Java 8已添加到受支持的配置列表中。 其中包括Oracle JDK和IBM JDK。 Java SE 7公开更新结束通知 2015年4月之后&#xff0c;Oracle将不再将Java …

C语言史上最愚蠢的BUG ???

点击蓝字关注我们本文来自“The most stupid C bug ever”&#xff0c;很有意思&#xff0c;分享给大家。我相信这样的bug&#xff0c;就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。。首先&#xff0c;作者想用一段程序来创建一个文件&#xff0c;如果有文件名的话&…