我使用的是spring jms和activemq结合,在配置文件中定义了普通的connectionFactory的bean,如下所示:
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<description>JMS连接工厂</description>
<property name="brokerURL" value="tcp://192.168.20.23:61616" />
</bean>
定义了上面的文件之后,在使用spring jms的JmsTemplate发送jms消息时,如果发送大量消息的话,有时候会抛出如下异常:
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS
processing; nested exception is javax.jms.JMSException: Could not connect to broker
URL: tcp://192.168.20.23:61616. Reason: java.net.BindException: Address already in use: connect
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:534)
at net.kentop.astoam.device.MG800DeviceService.excute(MG800DeviceService.java:423)
at net.kentop.astoam.device.MG800DeviceService$HandlerReceiveMessage.
handlerUdpData(MG800DeviceService.java:936)
at net.kentop.mon4mg.monitor.UDPReceiverThread.run(UDPReceiverThread.java:51)
Caused by: javax.jms.JMSException: Could not connect to broker URL: tcp://192.168.20.23:61616.
Reason: java.net.BindException: Address already in use: connect
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:35)
at org.apache.activemq.ActiveMQConnectionFactory.
createActiveMQConnection(ActiveMQConnectionFactory.java:286)
at org.apache.activemq.ActiveMQConnectionFactory.
createActiveMQConnection(ActiveMQConnectionFactory.java:230)
at org.apache.activemq.ActiveMQConnectionFactory.
createConnection(ActiveMQConnectionFactory.java:178)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:456)
... 4 more
而且在运行的时候会增加很多activemq的线程,使得整个程序运行起来比较慢。通过观察,猜测主要原因是连接activemq时,没有使用池连接,导致每次发送jms消息时,用的不是同一个连接,而是创建一个新的连接,所以耗费很多系统资源,并且因为整个项目是多线程的,所以就会抛出如上面的异常。解决方法是将activemq的连接的bean定义为activemq的池连接定义,将配置文件中的connectionFactory的bean定义改为如下内容:
<bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.20.23:61616" />
</bean>
</property>
</bean>
修改之后重新运行程序,再测试。果然没有占用那么多资源,而且也不会抛出上面的异常了。
注意:要使用activemq的池连接,必须在classpath中包含有activemq-pool.jar
分享到:
相关推荐
当使用多个线程(如10个)以一定频率(比如每100毫秒)发送消息时,可能会出现发送一定数量的消息后(约3000条),所有线程停止,并抛出异常 `javax.jms.JMSException: Could not connect to broker`。进一步查看...
private static final String BROKEN_URL = ActiveMQConnection.DEFAULT_BROKER_URL; ConnectionFactory connectionFactory; Connection connection; Session session; ThreadLocal...
在IT行业中,ActiveMQ是一个非常重要的消息中间件,它基于开放标准JMS(Java Message Service)规范,提供了高效、可靠的异步通信能力。SpringBoot框架则以其简洁的配置和快速的开发体验,成为了现代Java应用的首选...
<property name="brokerURL" value="tcp://localhost:61616" /> <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"> <bean id="jmsTemplate" class="org.springframework.jms.core....
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循开放消息传递协议(Open Message Broker,JMS)标准,提供高效、可靠的消息传递服务。在本文中,我们将深入探讨ActiveMQ的基本概念、工作原理以及如何...
spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin ``` 然后,我们需要创建一个消息生产者,即发送消息的类。Spring Boot通过`@Component`注解创建...
Java 连接并访问 ActiveMQ 概述: ActiveMQ 是 Apache 软件基金会下的一个开源的消息队列系统,广泛应用于企业级应用程序中。在 Java 项目中,如果需要使用 ActiveMQ,需要了解如何连接并访问 ActiveMQ。本文将详细...
这里的`brokerURL`指定了ActiveMQ服务器的地址和端口。 3. **创建Destination**:Destination是消息的接收者,可以是Queue(点对点)或Topic(发布/订阅)。在Spring配置文件中定义Queue或Topic: ```xml ...
<property name="brokerURL" value="tcp://localhost:61616"/> <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"> <bean id="jmsTemplate" class="org.springframework.jms.core....
**ActiveMQ与Spring整合详解** ActiveMQ是Apache组织开发的一款开源消息中间件,它遵循Java消息服务(JMS)规范,提供可靠的消息传递和高效的消息处理能力。在企业级应用中,ActiveMQ常用于实现应用之间的解耦,...
Spring集成ActiveMQ配置是将Spring框架与Apache ActiveMQ消息中间件结合,以便在应用程序中实现JMS(Java消息服务)消息的发送和接收。这里我们将详细介绍这个集成过程的关键步骤和涉及的技术点。 首先,集成环境...
<property name="brokerURL" value="tcp://localhost:61616"/> <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"> <value>myQueue <bean id="jmsTemplate" class="org....
ActiveMQ默认使用JMS Message ID,这是一个由broker生成的ID,通常格式为`ID:<brokerName>-<sequenceNumber>-<timestamp>`。这种ID在大多数情况下已经足够,但有时我们可能需要根据业务逻辑生成具有特定含义的...
<property name="brokerURL" value="tcp://localhost:61616" /> <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"> <bean id="jmsTemplate" class="org.springframework.jms.core....
在JMS应用中,必须妥善处理各种可能的异常,例如`JMSException`,并考虑重新发送消息或回滚事务的情况。 总结,一个简单的JMS客户端应用涉及到连接管理、会话创建、消息生产和消费等多个环节,利用JMS提供的API...