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:和原来基本一致,加了一句,修改超时时间
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值