springboot之ActiveMQ连接池

本文分享了一次ActiveMQ连接管理的实战经验,揭示了未启用连接池时,高并发下如何导致大量TIME_WAIT状态的连接,进而讲解了如何通过配置SpringBoot的ActiveMQ连接池来有效避免这一问题,确保系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot之ActiveMQ连接池【踩坑】 

https://my.oschina.net/booktao/blog/1610097

涛涛已经有人使用

  涛涛已经有人使用 发布于 2018/01/20 18:28 

字数 256

 

阅读 4339

 

收藏 0

 

点赞 0

 

 评论 2

Spring BootActiveMQ

开发四年只会写业务代码,分布式高并发都不会还想去BAT?>>>   

踩过了才知道有坑,很久之前开发了一个程序,跑了快半年了,往ActiveMQ送数据。

最近发现,把MQ给连死了,每分钟五千条数据,造了五千个连接(TIME_WAIT)。

之前开发没有深究,随便百度了一下,网上基本都是这样的套路。spring.activemq.pool.enabled=false时,每发送一条数据创建一个连接。。。。。

spring.activemq.broker-url=tcp://127.0.0.1:61616
spring.activemq.in-memory=false
spring.activemq.pool.enabled=false

 

从坑里爬起来,必须搞连接池。

spring.activemq.broker-url=tcp://127.0.0.1:61616
spring.activemq.in-memory=false
#true表示使用连接池
spring.activemq.pool.enabled=true
#连接池最大连接数
spring.activemq.pool.max-connections=5
#空闲的连接过期时间,默认为30秒
spring.activemq.pool.idle-timeout=30000
#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never 
spring.activemq.pool.expiry-timeout=0

pom.xml也要加入依赖包,否则启动报JmsMessagingTemplate注入失败 。

		<dependency>
		    <groupId>org.apache.activemq</groupId>
		    <artifactId>activemq-pool</artifactId>
		</dependency>

完美解决。

<think>好的,我现在需要帮助用户了解如何在Spring Boot中集成ActiveMQ。首先,我得回忆一下用户之前的问题,他们之前问过为什么不需要指定版本,现在要的是集成步骤,所以可能需要从基础开始讲起,确保他们能一步步跟着做。 用户可能是一个刚开始使用Spring Boot和ActiveMQ的开发者,所以步骤需要详细,避免跳步。我需要先确定他们是否已经有一个Spring Boot项目,或者是否需要从零开始创建。考虑到用户可能已经有项目,但为了全面,还是应该包括创建项目的步骤,比如使用Spring Initializr或者手动添加依赖。 接下来,依赖部分很重要。用户之前已经知道版本由父POM管理,所以这里只需要提到添加spring-boot-starter-activemq依赖,不需要再提版本的问题。但可能需要解释这个starter包含了哪些必要的库,比如ActiveMQ客户端和Spring的JMS支持。 然后是配置部分。用户需要知道如何在application.properties或application.yml中配置ActiveMQ的连接信息。这里要说明默认的内置Broker,以及如何连接到外部Broker。可能需要提到两种模式:队列和主题,以及如何配置它们。同时,提醒用户如果使用外部ActiveMQ实例,需要确保其运行并正确配置连接参数。 接下来是创建生产者和消费者。这里需要给出代码示例,比如使用JmsTemplate发送消息,以及使用@JmsListener注解来监听消息。要强调注解的使用和如何指定目的地名称。可能需要提到消息转换器,比如自动将对象转换为JSON,但可能需要配置Jackson依赖。 然后,启动类和测试部分。用户需要知道如何启动应用,并验证消息是否被正确发送和接收。测试部分可以建议编写单元测试或者使用主方法发送测试消息。可能需要提醒用户启动ActiveMQ Broker,如果是内置的话,Spring Boot会自动启动,但外部的话需要手动启动。 高级配置部分,可以提到连接池、持久化配置、事务管理等,但用户可能暂时不需要这些,所以简要提一下即可,供有需要的用户参考。另外,安全性和性能调优可能属于更高级的话题,可以放在最后作为扩展内容。 最后,常见问题部分。用户可能会遇到的依赖缺失、配置错误、注解不生效等问题,需要给出排查步骤,比如检查依赖是否添加,配置是否正确,Broker是否运行,日志是否有错误信息等。这部分能帮助用户自主解决问题,减少后续的困惑。 需要确保整个步骤逻辑清晰,代码示例正确,并且配置项准确。同时,语言要简洁明了,避免使用过于专业的术语,或者至少解释清楚术语的含义。可能还需要对比内置Broker和外部Broker的区别,让用户根据需求选择合适的方式。 另外,考虑到用户可能对ActiveMQ不熟悉,可以简要介绍ActiveMQ是什么,它的作用,以及在消息队列中的常见使用场景,比如解耦系统组件、异步处理等。但用户的问题主要集中在集成步骤,所以这部分可以简短带过,重点放在实现步骤上。 最后检查是否有遗漏的步骤,比如是否需要配置消息转换器,或者是否需要手动创建队列和主题。在Spring Boot中,通常会自动创建目的地,但如果是外部ActiveMQ可能需要预先创建,这点可能需要提及,或者说明Spring Boot的自动配置行为。 总结一下,整个思考过程需要涵盖从项目创建、依赖添加、配置、代码实现、测试到高级配置和问题排查的各个方面,确保用户能够按照步骤成功集成ActiveMQ,并理解每个步骤的作用和原理。</think>### Spring Boot集成ActiveMQ完整指南 ```mermaid graph TD A[创建项目] --> B[添加依赖] B --> C[配置参数] C --> D[创建生产者] C --> E[创建消费者] D --> F[测试验证] E --> F ``` --- #### **1. 基础环境搭建** **步骤1:创建Spring Boot项目** ```xml <!-- pom.xml 核心依赖 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> </dependencies> ``` **步骤2:配置参数(application.yml)** ```yaml spring: activemq: broker-url: tcp://localhost:61616 # 外部ActiveMQ地址 user: admin password: admin packages: trust-all: true # 信任所有序列化对象 pool: enabled: true # 启用连接池 max-connections: 10 # 内置Broker配置(可选) jms: pub-sub-domain: false # false=队列模式,true=主题模式 ``` --- #### **2. 消息生产与消费** **消息生产者示例** ```java @Component public class MessageProducer { @Autowired private JmsTemplate jmsTemplate; // 发送文本消息 public void sendTextMessage(String destination, String message) { jmsTemplate.convertAndSend(destination, message); } // 发送JSON对象 public void sendObjectMessage(String destination, Order order) { jmsTemplate.convertAndSend(destination, order); } } ``` **消息消费者示例** ```java @Component public class MessageConsumer { // 监听指定队列 @JmsListener(destination = "ORDER_QUEUE") public void receiveOrder(Order order) { System.out.println("收到订单:" + order); } // 处理文本消息 @JmsListener(destination = "ALERT_TOPIC", containerFactory = "jmsListenerContainerFactory") public void handleAlert(String message) { System.out.println("系统告警:" + message); } } ``` --- #### **3. 高级配置** **自定义连接工厂** ```java @Configuration @EnableJms public class JmsConfig { @Value("${spring.activemq.broker-url}") private String brokerUrl; @Bean public ActiveMQConnectionFactory connectionFactory() { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); factory.setBrokerURL(brokerUrl); factory.setTrustAllPackages(true); return factory; } @Bean public JmsListenerContainerFactory<?> jmsListenerContainerFactory( ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setPubSubDomain(true); // 启用主题模式 return factory; } } ``` **消息转换器配置** ```java @Bean public MessageConverter jacksonJmsMessageConverter() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT); converter.setTypeIdPropertyName("_type"); return converter; } ``` --- #### **4. 启动与测试** **启动类配置** ```java @SpringBootApplication public class Application implements CommandLineRunner { @Autowired private MessageProducer producer; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) { // 发送测试消息 producer.sendTextMessage("TEST_QUEUE", "Spring Boot ActiveMQ测试"); } } ``` **控制台验证输出** ``` 2023-09-15 10:00:00.123 INFO o.a.activemq.broker.BrokerService - ActiveMQ JMS Message Broker (localhost) started 收到消息:Spring Boot ActiveMQ测试 ``` --- #### **5. 运行模式对比** | 模式 | 配置方式 | 适用场景 | |------------|---------------------------------|------------------------| | 内置Broker | `spring.activemq.in-memory=true` | 开发测试环境 | | 外部Broker | 指定实际broker-url | 生产环境 | | 队列模式 | `pub-sub-domain=false` | 点对点消息(独占消费) | | 主题模式 | `pub-sub-domain=true` | 发布/订阅模式(广播消息) | --- #### **6. 数学验证模型** 设: - 生产者发送速率 $\lambda$(条/秒) - 消费者处理速率 $\mu$(条/秒) 系统稳定条件: $$ \rho = \frac{\lambda}{\mu} < 1 \quad \text{(队列不溢出条件)} $$ 消息堆积量计算: $$ L = \frac{\rho^2}{1-\rho} \quad \text{(Little's Law推导)} $$ --- #### **7. 常见问题排查** 1. **连接拒绝** ```bash telnet localhost 61616 # 验证端口连通性 netstat -ano | findstr 61616 # Windows端口检查 ``` 2. **序列化错误** ```java // 在配置中增加信任包 spring.activemq.packages.trust-all=false spring.activemq.packages.trusted=com.example.dto ``` 3. **消息堆积监控** ```java // 获取队列深度 QueueBrowser browser = jmsTemplate.browseSelected("QUEUE_NAME", "JMSPriority > 3", (session, queueBrowser) -> { Enumeration<?> messages = queueBrowser.getEnumeration(); return Collections.list(messages).size(); }); ``` --- 通过以上步骤可实现完整的ActiveMQ集成,建议使用Docker快速搭建测试环境: ```bash docker run -p 61616:61616 -p 8161:8161 rmohr/activemq ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值