SpringBoot集成ActiveMQ实例详解

发布网友 发布时间:2024-12-22 12:22

我来回答

1个回答

热心网友 时间:6分钟前

在项目开发过程中,我们经常会遇到需要处理的业务场景,例如用户申请提现,后台进行账务处理、发送提现短信、调用银行打款通道等。在这个过程中,调用第三方通道如短信或银行通道通常较为耗时,同时账务处理可能由专门的账务系统进行。为了提高并发性和响应速度,可以将后续的三个操作异步处理,这时消息队列就派上用场了。

消息队列中间件在分布式系统中扮演着重要角色,主要用于解决应用耦合、异步消息、流量削峰等问题,实现高性能、高可用、可扩展和最终一致性架构,是大型分布式系统不可或缺的组件。市面上常见的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。Spring Boot提供了spring-boot-starter-activemq,以支持ActiveMQ的自动集成配置。

ActiveMQ是一种基于JMS规范实现的消息中间件,设计目标是提供标准、面向消息、多语言和多系统应用集成的高效消息通信中间件。它能够为企业的应用消息传递提供高可用性、出色性能、可扩展性、稳定性和安全保障。ActiveMQ不仅实现JMS规范,还提供了额外的特性支持,包括队列和订阅两种消息发送模式。

ActiveMQ的数据传送流程如下图所示。ActiveMQ支持两种消息传递类型:一是点对点传输,一个生产者对应一个消费者,生产者向broker推送数据,数据存储在broker的一个队列中,消费者接收队列中的数据;二是基于发布/订阅模式的传输,根据订阅话题接收相应数据,一个生产者可以向多个消费者推送数据,类似于MQTT协议的实现。

队列模式的实例包括使用ActiveMQQueue和JmsMessagingTemplate类实现队列的创建、生产者和消费者。队列模式实例在Spring Boot中通常通过简单的实例化操作完成队列创建,然后创建生产者和消费者代码。生产者和消费者分别使用JmsMessagingTemplate和队列名称进行消息的发送和接收。通过单元测试验证消息发送和接收的正确性。

订阅模式实例则在原有的队列模式基础上进行扩展,通过配置spring.jms.pub-sub-domain为true来启用广播模式。这时队列模式将无法正常工作。为演示多个广播接收者,需要在消费者中新增两个消费者。在MyMqConfig配置类中实例化基于队列和订阅的工厂类,并在对应的消费者方法上添加containerFactory属性。单元测试类中新增测试以验证消息发送成功。

Spring Boot默认仅支持队列或广播模式之一,如果需要同时支持两种形式,可以自定义JmsListenerContainerFactory实例。通过DefaultJmsListenerContainerFactory创建自定义的JmsListenerContainerFactory实例,并在@JmsListener注解中使用containerFactory属性进行配置。这样可以在消费者方法上同时接收队列和话题消息。

在使用消息队列时,有几点需要注意:activeMq端口号通常为61616;使用topic时需要配置spring.jms.pub-sub-domain=true;队列如果没有消费者,信息会存储在队列中;发送消息对象时需要进行序列化,接收对象信息时使用ObjectMessage进行转化;使用JmsListener注解中的containerFactory属性可以配置spring.jms.pub-sub属性,实现同时接收队列和话题;queue为点对点模式,topic为发布订阅模式;消息队列名称(如sms.queue和sms.topic)可以根据需要设置为配置属性。完整的示例代码和相关参考资料已提供。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com