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

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐