在Spring使用AWS SQS创建消息驱动Bean

在我之前的文章中,我展示了一个简单的示例,该示例如何将AWS SQS与Spring Framework结合使用以将消息放入队列中并从队列中读取消息。 在本文中,我将更进一步,并使用Spring创建一个“消息驱动的Bean”,以便对放入队列中的每个消息都进行“自动”处理。 AWS在其文档页面上将其称为异步方式。 要做到这一点,我将在Spring中定义一个MessageListener并将其配置为描述来听我的队列在这里 。 要查看初始项目设置,请参阅我的前一篇文章,因为在此不再赘述。

Spring应用程序上下文将定义消息侦听器(和相应的对象),如下所示:

<bean id="amazonMessageListener" class="net.pascalalma.aws.sqs.SpringMessageDrivenBean" /><bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"><property name="delegate" ref="amazonMessageListener"/><property name="defaultListenerMethod" value="onMessage"/><property name="messageConverter"><null/></property></bean><bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory"/><property name="destinationName" ref="queueName" /><property name="messageListener" ref="messageListener" /></bean>

首先,我定义了我的MDB(MessageDrivenBean)bean,并将其称为“ amazonMessageListener”。 接下来,我将此MDB用作“ messageListener”适配器的“代理”。 这个“适配器” bean还可以负责转换消息有效负载(此处忽略)并在委托的侦听器中调用正确的方法。

在'jmsContainer'bean中,'adapter'与使用的JMS连接Factory和目标链接在一起。

剩下的就是MDB本身的源代码:

package net.pascalalma.aws.sqs;import org.apache.log4j.Logger;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;public class SpringMessageDrivenBean {final static Logger logger = Logger.getLogger(SpringMessageDrivenBean.class);public void onMessage(Message message) {if (message instanceof TextMessage) {try {logger.info(String.format("MDB received: %s ", ((TextMessage) message).getText()));}catch (JMSException ex) {throw new RuntimeException(ex);}}else {throw new IllegalArgumentException("Message must be of type TextMessage");}}
}

我认为这非常简单。 对于放在队列中的每条消息,都会调用方法“ onMessage”,在这种情况下,它仅打印消息的文本内容。 为了查看它的工作原理,我使用下面的“ main”类:

package net.pascalalma.aws.sqs;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringMdbMain {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 ProviderService class;MyMessageProvider prdSvc = (MyMessageProvider) ctx.getBean("myMessageProviderService");//Call getProduct method of ProductServiceprdSvc.sendMessage("This is a test A");prdSvc.sendMessage("This is a test B");prdSvc.sendMessage("This is a test C");prdSvc.sendMessage("This is a test D");}
}

结果为以下输出:

2015-04-11 13:17:20 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(23) - Sending message with txt: This is a test A
2015-04-11 13:17:26 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(36) - Message sent 
2015-04-11 13:17:26 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(23) - Sending message with txt: This is a test B
2015-04-11 13:17:26 INFO  net.pascalalma.aws.sqs.SpringMessageDrivenBean(16) - MDB received: This is a test A 
2015-04-11 13:17:26 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(36) - Message sent 
2015-04-11 13:17:26 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(23) - Sending message with txt: This is a test C
2015-04-11 13:17:26 INFO  net.pascalalma.aws.sqs.SpringMessageDrivenBean(16) - MDB received: This is a test B 
2015-04-11 13:17:27 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(36) - Message sent 
2015-04-11 13:17:27 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(23) - Sending message with txt: This is a test D
2015-04-11 13:17:27 INFO  net.pascalalma.aws.sqs.SpringMessageDrivenBean(16) - MDB received: This is a test C 
2015-04-11 13:17:27 DEBUG net.pascalalma.aws.sqs.MyMessageProvider(36) - Message sent 
2015-04-11 13:17:27 INFO  net.pascalalma.aws.sqs.SpringMessageDrivenBean(16) - MDB received: This is a test D

翻译自: https://www.javacodegeeks.com/2015/05/creating-a-message-driven-bean-with-aws-sqs-in-spring.html

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

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

相关文章

springboot中得注解_Spring以及SpringBoot中的常用的注解小结

一、注解的基本概念Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解)是一个接口&#xff0c;程序可以通过反射来获取指定程序元素的Annotion对象&#xff0c;然后通过Annotion对象来获取注解里面的元数据。…

Asp.net MVC 的一些总结(二)——图片显示

这里实现的是&#xff0c;如下图片所示的效果&#xff1a; 当然&#xff0c;当你看的下图的时候&#xff0c;请不要自己想当然的认为是简单的html布局&#xff01;&#xff01;&#xff01; &#xff08;1&#xff09;业务说明&#xff1a;图片地址是数据库里存的&#xff0c;图…

Spring整合基础

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

最长子串(FZU2128)

最长子串 Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice FZU 2128Description 问题很简单&#xff0c;给你一个字符串s&#xff0c;问s的子串中不包含s1,s2...sn的最长串有多长。Input 输入包含多组数据。第一行为…

微信小程序开发起步

刚开发开发小程序的小伙伴可以参考下面的帖子&#xff1a; https://cloud.tencent.com/developer/article/1190821

virsh 网络设置_KVM使用Network Filters进行虚拟机网络管理 | leon的博客

1.1 Network Filters介绍Network filtering XML为虚拟化系统管理员提供了一种网络流量的过滤规则&#xff0c;系统管理员可以通过配置过滤参数实施和管理对虚拟机网络流量的接受和转发&#xff0c;由于过滤规则不能绕过直接进入虚拟机内&#xff0c;使得一个filter对虚拟用户的…

java 布局管理器_有时在Java中,一个布局管理器是不够的

java 布局管理器在开发Java Swing应用程序时&#xff0c;最经常的是&#xff0c;我们需要在多个嵌套面板中使用多个布局管理器。 这通常不是问题&#xff0c;被认为是几乎所有人类已知语言的所有UI开发的常规做法。 但是&#xff0c;大多数情况下&#xff0c;对于UI中的每个面板…

支付宝支付、微信支付(最详细教程)

对接支付宝支付接口&#xff0c;官方文档已经写的很清楚了&#xff0c;但是也有很多像我一样的小白&#xff0c;第一次对接支付宝支付接口&#xff0c;会有些迷茫&#xff0c;所以我在此写下这篇文章&#xff0c;给我和我一样的同学&#xff0c;一点思路吧。 第一步&#xff1…

Lintcode: O(1) Check Power of 2

Using O(1) time to check whether an integer n is a power of 2. Example For n4, return trueFor n5, return falseChallenge O(1) timeTags Expand 这道题考察bit manipulation. 1的个数只能有1个才是power of 2. 主要是要注意Integer.MIN_VALUE&#xff0c;这个只有一个1…

降雨插值_ArcGIS计算土壤侵蚀模数(二)降雨侵蚀力因子R计算

本次采用中国土壤流失方程CSLE计算土壤侵蚀模数&#xff0c;计算公式为&#xff1a;ARKLSBET式中&#xff0c;式中&#xff1a;A—土壤侵蚀模数。thm-2a-1&#xff1b;R—降雨侵蚀力因子&#xff0c;MJmmhm-2h-1a-1&#xff1b;K—土壤可蚀性因子&#xff0c;thm2hhm-2MJmm-1&a…

购买阿里云ECS服务器忘记终端管理密码或者没有设置

自己开发一个APP,想把源码放到服务器上跑一跑,发现使用Xshell远程连接不上去,我记得买服务器的时候没有设置。 一般有两种方法: 1.买服务器的时候,阿里会给你发一份邮件,邮件里面有,这个是官方的说法,我是公司CTO,账号是老板开的,根本不可能看到邮件,所以对我来说不…

mustache,用{{}}获取值

{{}}是属于java mustache controller类设置保存对象值在cars-common中有引入mustache.js&#xff0c;web再引入cars-common。jar包<bean id"viewResolver" class"com.fw.cars.common.infra.web.context.mustache.MustacheViewResolver">转载于:https…

输出空格隔开换行_【前端干货】CSS 的空格处理

一空格规则HTML 代码的空格通常会被浏览器忽略。<p>◡◡hello◡◡world◡◡</p>上面是一行 HTML 代码&#xff0c;文字的前部、内部和后部各有两个空格。为了便于识别&#xff0c;这里使用半圆形符号◡表示空格。浏览器的输出结果如下。hello world可以看到&#x…

宝塔面板绑定域名导致无法访问

用这个命令rm -f /www/server/panel/data/domain.conf删除绑定域名后&#xff0c; 就能用ip端口进入面板了&#xff0c;以后还是不要绑定域名了 主要是因为我手残。 看重点&#xff0c;我是绑定了域名&#xff0c;用域名也无法访问。 现在终于进去啦

【转】在.Net中关于AOP的实现

原文地址&#xff1a;http://www.uml.org.cn/net/201004213.asp 一、AOP实现初步 AOP将软件系统分为两个部分&#xff1a;核心关注点和横切关注点。核心关注点更多的是Domain Logic&#xff0c;关注的是系统核心的业务&#xff1b;而横切关注点虽与核心的业务实现无关&#xff…

宝塔访问域名访问不到

首先说明一点&#xff0c;我这个问题不是宝塔面板绑定域名的那种情况。 浏览器输入域名会报上面的错误&#xff0c;经过各种尝试&#xff0c;发现是安全组没有放开&#xff0c;在阿里云控制台添加一个80/80的通用安全组规则即可&#xff0c;知道上行和下行的区别&#xff0c;打…

spring.jpa配置_使用JPA和Spring 3.1进行事务配置

spring.jpa配置1.概述 本教程将讨论配置Spring Transactions &#xff0c;使用Transactional批注和常见陷阱的正确方法 。 有关核心持久性配置的更深入讨论&#xff0c;请查看Spring with JPA教程 。 有两种不同的配置事务的方法– 批注和AOP –每种都有自己的优势–我们将在…

双千兆和双频千兆哪个好_关于千兆路由器的那些事儿!赶紧收藏

无线Wi-Fi已成为现代人生活、工作的标配&#xff0c;随着百兆乃至千兆的光纤网络普及&#xff0c;传统路由器已跟不上时代的速度了。不少用户的眼光已投向速度更快的千兆路由器&#xff0c;那么大家真的了解什么是千兆路由器吗&#xff1f;千兆路由器有哪几种&#xff1f;近期火…

宝塔常用的命令大全(直接上官网)

安装宝塔 Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh Ubuntu/Deepin安装脚本 wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh && sudo bash ins…

华三ospf联动bfd_HCIE2020__路由交换专家__BFD综合实验

1.1.1 关于本实验本实验通过配置BFD与BGP协议联动及与VRRP协议联动&#xff0c;掌握BFD的功能和配置方法。1.1.2 实验目的理解BFD的工作原理。 掌握BFD与BGP联动的应用场景及配置方法。 掌握BFD与VRRP联动的应用场景及配置方法。1.1.3 实验组网介绍图1-1 BFD原理配置实验拓扑图…