javascript
通过Spring将AWS SQS用作JMS提供程序
最近AWS公布了新的客戶端庫(kù),它實(shí)現(xiàn)了JMS 1.1規(guī)范 ,并使用他們的簡(jiǎn)單隊(duì)列服務(wù) (SQS)作為JMS提供者 (見(jiàn)杰夫·巴爾的帖子在這里 )。 在我的文章中,我將向您展示如何設(shè)置Maven項(xiàng)目以使用Spring Framework來(lái)使用該庫(kù)。
我們將執(zhí)行以下步驟:
- 在AWS管理控制臺(tái)中創(chuàng)建隊(duì)列
- 在機(jī)器上設(shè)置您的AWS憑證
- 設(shè)置您的Maven項(xiàng)目
- 創(chuàng)建Spring配置
- 創(chuàng)建Java文件以產(chǎn)生和接收消息
這篇文章將僅顯示SQS可能性的一些基本用法,但應(yīng)該足以幫助您入門(mén)。 我假設(shè)您已經(jīng)創(chuàng)建了AWS賬戶 ,并且熟悉Maven和基本的Spring設(shè)置。
在AWS管理控制臺(tái)中創(chuàng)建隊(duì)列
第一步是創(chuàng)建隊(duì)列,以便我們可以在程序中使用它。 我向您展示了如何使用管理控制臺(tái)創(chuàng)建隊(duì)列,但是您也可以通過(guò)編程方式創(chuàng)建必要的隊(duì)列。
轉(zhuǎn)到管理控制臺(tái)時(shí),可以選擇SQS頁(yè)面,然后單擊“創(chuàng)建新隊(duì)列”按鈕:
輸入隊(duì)列名稱(chēng),并單擊“創(chuàng)建隊(duì)列”按鈕,以接受當(dāng)前的默認(rèn)設(shè)置:
在機(jī)器上設(shè)置您的AWS憑證
為了能夠使用Java SDK訪問(wèn)您的AWS資料,最簡(jiǎn)單的方法是在用戶的主目錄中創(chuàng)建一個(gè)“ credentials.proeprties”文件。 在?/ .aws / credentials(對(duì)于Windows用戶為C:\ Users \ USER_NAME \ .aws \ credentials)處創(chuàng)建憑據(jù)文件,并在將大寫(xiě)的值替換為您自己的值之后,保存以下行。
[default] aws_access_key_id = YOUR_ACCESS_KEY_ID aws_secret_access_key = YOUR_SECRET_ACCESS_KEY設(shè)置您的Maven項(xiàng)目
使用Maven設(shè)置項(xiàng)目時(shí),可以將以下依賴(lài)項(xiàng)添加到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>創(chuàng)建Spring配置
在第一個(gè)示例中,我將使用一個(gè)簡(jiǎn)單的MessageProducer和MessageConsumer類(lèi),其中生產(chǎn)者將消息放入隊(duì)列,而使用者將從隊(duì)列中讀取一條消息。 這是模型是下文稱(chēng)要通過(guò)AWS作為一個(gè)“同步”的呼叫。 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>創(chuàng)建Java文件以產(chǎn)生和接收消息
最后一步是創(chuàng)建必要的Java文件。 我認(rèn)為它們足夠簡(jiǎn)單且易于解釋,因此我僅在此處顯示源代碼。 首先,我們有MessageProducer,它在執(zhí)行消息時(shí)將消息放入隊(duì)列中:
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 ");} }接下來(lái)是MessageConsumer,在此示例中,MessageConsumer在執(zhí)行時(shí)僅從隊(duì)列中讀取一條消息:
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類(lèi),它讀取Spring配置并運(yùn)行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);}} }當(dāng)運(yùn)行Main類(lèi)時(shí),一切正常時(shí),您將看到以下輸出:
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
總結(jié)
以上是生活随笔為你收集整理的通过Spring将AWS SQS用作JMS提供程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微众银行每月有扣费吗?
- 下一篇: 微信零钱限额开通微众银行安全吗?