在 Spring 中使用 AWS SQS 创建消息驱动 Bean
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在 我之前的帖子 中,我展示了一个简单的示例,说明如何使用 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 中,“适配器”与使用的 JMS 连接工厂和要侦听的目标链接。剩下的就是 MDB 本身的源代码:
<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>
我认为这是相当简单的。为放入队列的每条消息调用方法“onMessage”,在这种情况下它只是打印消息的文本内容。要查看它是否正常工作,我使用以下“主”类:
<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>
这导致以下输出:
<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>