当前位置: 首页 > 知识库问答 >
问题:

RabbitMQ:为什么重新连接后通道不重新打开?

欧君之
2023-03-14

在我的应用程序与RabbitMQ服务器失去连接后,我在日志中看到

ERROR ... o.s.a.r.c.CachingConnectionFactory : Channel shutdown: connection error

然后,当我的应用程序重新连接到RabbitMQ服务器时,我在日志中看到

INFO ...  Created new connection: SimpleConnection@7d9717bc [delegate=amqp://******]

但是,当应用程序重新连接到RabbitMQ服务器时,通道不会重新打开,在RabbitMQ管理控制台中,我可以在“通道”选项卡中看到没有任何通道。

重新连接后,在RabbitMQ服务器日志中:

=INFO REPORT==== 13-Jul-2017::10:33:39 ===
accepting AMQP connection (*.*.*.*:* -> *.*.*.*:5672)

=INFO REPORT==== 13-Jul-2017::10:33:39 ===
Connection (*.*.*.*:* -> *.*.*.*:5672) has 
a client-provided name: rabbitConnectionFactory#1

=INFO REPORT==== 13-Jul-2017::10:33:39 ===
connection (*.*.*.*:* -> *.*.*.*:5672 - 
rabbitConnectionFactory#1): user '***' authenticated and granted access to vhost '***'

我使用的是Spring Boot 1.5.3和Spring Boot starter amqp

看起来Spring AMQP 1.7禁用了rabbitmq客户端的“enableAutomaticRecovery”,并使用了自己的恢复机制

4.0。x客户端默认启用自动恢复;虽然与此功能兼容,但Spring AMQP有自己的恢复机制,通常不需要客户端恢复功能。建议禁用amqp客户端自动恢复,以避免在代理可用但连接尚未恢复时获取AutoRecoverConnectionNotCurrentlyOpenException。从版本1.7.1开始,Spring AMQP将禁用它,除非您显式创建自己的RabbitMQ连接工厂并将其提供给CachingConnectionFactory。默认情况下,由RabbitConnectionFactoryBean创建的RabbitMQ ConnectionFactory实例也将禁用该选项。

我不确定这是否与问题有关。

请注意,如果我关闭并重新启动应用程序,它的行为与预期一致。

共有1个答案

经和歌
2023-03-14

Spring AMQP默认情况下关闭自动恢复:

private static com.rabbitmq.client.ConnectionFactory newRabbitConnectionFactory() {
    com.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();
    connectionFactory.setAutomaticRecoveryEnabled(false);
    return connectionFactory; 
}

您可以通过RabbitConnectionFactoryBean打开它:

/**
 * Set to true to enable amqp-client automatic recovery. Note: Spring AMQP
 * implements its own connection recovery and this is generally not needed.
 * @param automaticRecoveryEnabled true to enable.
 * @since 1.7.1
 */
public void setAutomaticRecoveryEnabled(boolean automaticRecoveryEnabled) {
    this.connectionFactory.setAutomaticRecoveryEnabled(automaticRecoveryEnabled);
}

Spring AMQP开箱即用的自动恢复对侦听器容器有好处,但我想您需要处理rabbitemplate。因此,请考虑将其打开:http://docs.spring.io/spring-amqp/reference/html/_reference.html#auto-恢复

 类似资料:
  • 我有一个PHP应用程序,使用RabbitMQ。为了实现冗余,我创建了一对RabbitMQ服务器,并将它们连接到一个集群中。我也有一个VyOS故障转移群集运行HAProxy负载平衡连接,并在故障转移的情况下提供重新路由。 昨天,我们的VyOS集群决定需要故障转移(可能是短暂的网络中断)。在一个VyOS上停止了HA代理,虚拟IP被移动,并在另一个节点上重新启动HA代理。 之后,我查看了Rabbit中的

  • 我从RabbitMq服务器收到此错误 服务器关闭通道:406(前提条件-失败),并显示消息“前提条件_失败-未知交付标签80” 发生这种情况是因为在消费者任务期间连接丢失,最后,当消息被确认/nack时,我收到此错误,因为我无法在与我接收它的通道不同的通道上确认消息。 这是 RabbitMq 连接的代码 如您所见,连接建立后会创建一个通道,在我收到连接问题后,通道设置为NULL,1秒钟后连接重试,

  • 重新建立mqtt连接,前提是必须已经通过Iot_id,Iot_pwd建立过一次mqtt连接。 请求方式: "|4|1|5|\r" 返回值: "|4|1|1|1|\r" mqtt连接状态:连接成功 "|4|1|1|2|reason|\r" mqtt连接状态:连接失败,字符串reason表示失败的原因 Arduino样例: softSerial.print("|4|1|5|\r");

  • 重新连接上一次连接的wifi。 请求方式: "|2|3|\r" 返回值: "|2|1|\r" wifi连接状态:wifi断开连接 "|2|2|\r" wifi连接状态:正在连接wifi "|2|3|ip|\r" wifi连接状态:wifi连接成功,返回OBLOQ的ip地址 "|2|4|\r" wifi连接状态:wifi连接失败,检查SSID和PWD是否输入正确 Arduino样例: softSer

  • 问题内容: 该程序连接到服务器,并且当服务器关闭连接时,如果我尝试重新连接,它会说: 如果我关闭客户端中的套接字,然后尝试重新连接,它会说:。 有没有办法在管道破裂后重新连接它而不创建新的套接字? 问题答案: 假设这是一个面向连接的套接字: 否。您必须关闭旧的插座并创建一个新的插座,