java项目在linux下无法连接rabbitmq(连接超时)
1. 问题描述
在linux下安装了rabbitmq(版本:3.6.9),erlang(版本:opt 19.1)
jdk(版本:1.8.0.131)
2. 问题搜寻
2.1 确保端口存在
5672:client端通信端口
15672:管理界面ui端口
2.2 确保telnet通
在其它服务器 telnet 当前rabbitmq的IP:5672 和 IP:15672能通
2.3 能看到rabbitmq ui界面
2.4 非项目问题
用一个最基础的springboot-rabbitmq的项目/用一个main方法,连接rabbitmq,测试是否存在问题
测试代码在可用该地址:
3. 查看rabbitmq日志
我的日志是这一个:rabbit@16c64g–0069.log
=WARNING REPORT==== 23-Oct-2020::21:04:24 ===
closing AMQP connection <0.842.0> (2.142.133.104:54520 -> 10.118.24.108:5672):
client unexpectedly closed TCP connection
=INFO REPORT==== 24-Oct-2020::15:23:44 ===
accepting AMQP connection <0.1840.0> (2.139.69.2:6337 -> 10.118.24.108:5672)
=WARNING REPORT==== 24-Oct-2020::15:23:46 ===
closing AMQP connection <0.1840.0> (2.139.69.2:6337 -> 10.118.24.108:5672):
client unexpectedly closed TCP connection
=INFO REPORT==== 24-Oct-2020::15:24:50 ===
accepting AMQP connection <0.1843.0> (2.142.133.104:58356 -> 10.118.24.108:5672)
=ERROR REPORT==== 24-Oct-2020::15:24:50 ===
closing AMQP connection <0.1843.0> (2.142.133.104:58356 -> 10.118.24.108:5672):
{handshake_timeout,handshake}
发现有个 handshake_timeout 的错误
4. demo测试
写了一个main方法的demo测试
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("IP");
factory.setVirtualHost("host");
factory.setPort(port);
factory.setUsername("root");
factory.setPassword("123456");
factory.setConnectionTimeout(60000);
factory.setHandshakeTimeout(60000);
factory.setShutdownTimeout(60000);
factory.setChannelRpcTimeout(60000);
factory.setWorkPoolTimeout(60000);
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicConsume(QUEUE_NAME, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
});
channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + message + "'");
}
}
对如下几行超时代码进行:打开一行,关闭其它行测试的操作
factory.setConnectionTimeout(60000);
factory.setHandshakeTimeout(60000);
factory.setShutdownTimeout(60000);
factory.setChannelRpcTimeout(60000);
factory.setWorkPoolTimeout(60000);
最后发现是 factory.setHandshakeTimeout(60000); 的时候才没有报连接超时的问题
5. 问题解决
我们是springboot项目,第一时间想到的是在yml文件里面配置这个超时时间,结果发现yml里面rabbitmq竟然没有我们需要的那个超时属性
发现在RabbitProperties属性文件中没有可以配置handshake的地方
但是,从测试main方法里面可以得出 ConnectionFactory对象是可以设置handshake的
我们的想法:修改ConnectionFactory对象里面的handshake的值,可以看到它被RabbitConnectionFactoryBean对象引用,这是个对象,无法修改对象内部的值,只能通过创建bean 的方式,它被RabbitAutoConfiguration里面所引用了, 那我们可以通过覆盖这个bean的创建来修改handshake的值。
项目结构:org.springframework一定要在java工程下,否则报错
RabbitHandProperties:
public class RabbitHandProperties {
public void setHandShakeTimeout(RabbitConnectionFactoryBean rabbitConnectionFactoryBean, Integer handShakeTimeout) {
rabbitConnectionFactoryBean.connectionFactory.setHandshakeTimeout(handShakeTimeout);
}
}
RabbitAutoConfiguration:和原来基本一致,加了一句,修改超时时间
更多推荐
所有评论(0)