我的应用程序失去与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实例默认情况下也会禁用该选项。
我不确定这是否与此问题有关。
请注意,如果我关闭我的应用并重新启动它,它会按预期运行。
答案 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