网络异常自动恢复(1) 由于服务端升级、服务端重启、网络抖动等原因,服务端和客户端的网络连接可能会断开。本文介绍如何在客户端设置Connection和Topology自动恢复,使Connection和Topology在网络连接断开后自动恢复,避免断连对业务造成影响。 触发原因 触发Connection自动恢复的原因如下: Connection的I/O抛出异常。 Socket读取操作超时。 检测到服务端心跳丢失。 恢复方法 4.0.0及以上版本Java客户端默认开启Connection和Topology自动恢复,无需在代码中设置。 在客户端开启Connection和Topology(Queue、Exchange、Binding、Consumer)自动恢复的方法如下: factory.setAutomaticRecoveryEnabled(boolean):用于开启或关闭Connection自动恢复。 factory.setNetworkRecoveryInterval(long):用于设置重试时间间隔。如果Connection自动恢复异常,设置了Connection自动恢复的客户端将在一段固定时间间隔(默认为5秒)后重试。 factory.setTopologyRecoveryEnabled(boolean):用于开启Topology自动恢复。Topology包括Queue、Exchange、Binding、Consumer。 示例代码 开启Connection和Topology自动恢复的客户端示例代码如下: ConnectionFactory factory newConnectionFactory(); // 设置接入点,在分布式消息服务RabbitMQ控制台实例详情页面获取。 factory.setHost("192.168.x.x"); // 设置Vhost名称 factory.setVirtualHost("/"); // 端口 factory.setPort(5672); // 基于网络环境设置合理的超时时间。 factory.setConnectionTimeout(301000); factory.setHandshakeTimeout(301000); factory.setShutdownTimeout(0); // 开启Connection自动恢复。 factory.setAutomaticRecoveryEnabled(true); // 设置Connection重试时间间隔为10秒。 factory.setNetworkRecoveryInterval(10000); // 开启Topology自动恢复。 factory.setTopologyRecoveryEnabled(true); Connection connection factory.newConnection(); 恢复限制 Connection自动恢复的限制如下: Connection断开需要一定的时间检测。要确保这段时间内发送的消息不丢失,需使用Publisher Confirms实现可靠发送。 Channel异常导致Connection断开时,不会触发Connection自动恢复。Channel异常通常为应用级别的问题,需要使用方自行处理。 Connection自动恢复不会使Channel也自动恢复。
来自: