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

时间:2017-07-18 17:03:02

标签: spring-amqp spring-rabbit spring-rabbitmq

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

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

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

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-client自动恢复,以避免在代理可用时获取AutoRecoverConnectionNotCurrentlyOpenException,但连接尚未恢复。从版本1.7.1开始,除非您明确创建自己的RabbitMQ连接工厂并将其提供给CachingConnectionFactory,否则Spring AMQP会禁用它。 RabbitConnectionFactoryBean创建的RabbitMQ ConnectionFactory实例默认情况下也会禁用该选项。

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

请注意,如果我关闭我的应用并重新启动它,它会按预期运行。

1 个答案:

答案 0 :(得分:2)

Spring AMQP关闭了automaticRecovery default

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开箱即用的自动恢复对听众容器有好处,但我想你会处理RabbitTemplate。因此,请考虑将其打开:http://docs.spring.io/spring-amqp/reference/html/_reference.html#auto-recovery