问题描述:
之前运维调整了测试服务器用的RabbitMQ的IP地址,并重新配置了RabbitMQ。
然后开发也相应修改了RabbitMQ的IP地址,但是测试时还是出问题了。
MQ生产者放不进去数据,也不报错;
MQ消费者收不到数据,报错很奇怪:
1.本地启动MQ消费者,报错Connection refused。
WARN||Consumer raised exception, processing can restart if the connection factory supports it.Exception summary: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connection|SimpleMessageListenerContainer.java|1168|
2.测试服务器启动MQ消费者,报错Connection timed out。
Consumer raised exception, processing can restart if the connection factory supports it.Exception summary: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection timed out|SimpleMessageListenerContainer.java|1168|
还好生产上的代码正常,因为没有调整MQ。
但是测试有问题,还是得想办法解决。
解决方法:
1.首先检查代码中配置的MQ基本信息,用户名(username)、密码(password)、MQ的IP地址(addresses)、端口(port)、虚拟主机(virtualHost)
mq消费者就用到了这5个配置,检查完后没有发现问题。
2.应该继续检查MQ中的用户权限是否配置正常(读写权限)、本地IP与测试IP是否有权限访问MQ服务器等(telnet倒是能通),但是似乎也没有问题。(自己没有权限、是别人检查的)
3.百度,发现答案五花八门,并没有解决了问题。
4.自己尝试,发现需要将端口号配置到IP后面,然后配置中去掉"port"才行。
但是之前分开写是没问题的,并且生产上也是分开写的。
总之,测试上得把端口号配置到IP后面,然后MQ生产者消费者就能正常使用MQ了。可能是运维重新配置RabbitMQ时,配置的与之前不一样了吧。
修改前代码(生产上正确,测试上不行;说明某种情况下不能这样写):
init.properties:
host=10.10.123.123
port=5672
context-rabbitMq.xml:
<bean id="connectionFactory2" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<property name="username" value="root" />
<property name="password" value="root" />
<property name="addresses" value="${host}" />
<property name="port" value="${port}" />
<property name="virtualHost" value="l_insurance_1" />
<property name="channelCacheSize" value="50" />
</bean>
修改后代码(将port写到mq的ip地址后面,然后删掉port):
init.properties:
host=10.10.123.123:5672
context-rabbitMq.xml:
<bean id="connectionFactory2" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<property name="username" value="root" />
<property name="password" value="root" />
<property name="addresses" value="${host}" />
<!-- <property name="port" value="${port}" /> -->
<property name="virtualHost" value="l_insurance_1" />
<property name="channelCacheSize" value="50" />
</bean>
总结:
当RabbitMQ报错Connection refused或Connection timed out时,确认配置信息与代码与权限无误后,可以试试把端口号写到IP后面,也许就能解决问题了。