2016-08-04 35 views
3

我正在面对一些problems与我的设置,我试图增加心跳间隔以测试可能的修复程序。 我使用增加春季兔子的心率值

Spring boot 1.3.2.RELEASE 
Spring rabbit 1.5.3.RELEASE 

和实例连接工厂的代码是低于

RabbitConnectionFactoryBean connectionFactoryBean = new RabbitConnectionFactoryBean(); 
connectionFactoryBean.setUseSSL(useSsl); 
connectionFactoryBean.setHost(rabbitHostname); 
connectionFactoryBean.setVirtualHost(rabbitVhost); 
connectionFactoryBean.setUsername(rabbitUsername); 
connectionFactoryBean.setPassword(rabbitPassword); 
connectionFactoryBean.setConnectionTimeout(900000); 
connectionFactoryBean.setRequestedHeartbeat(900); 
connectionFactoryBean.afterPropertiesSet(); 

CachingConnectionFactory cf = new CachingConnectionFactory(connectionFactoryBean.getObject()); 
cf.setChannelCacheSize(40); 
return cf; 

的问题是心跳间隔没有改变。我快速浏览一下在AMQConnection揭示了以下

int heartbeat = negotiatedMaxValue(this.requestedHeartbeat, 
            connTune.getHeartbeat()); 


private static int negotiatedMaxValue(int clientValue, int serverValue) { 
     return (clientValue == 0 || serverValue == 0) ? 
      Math.max(clientValue, serverValue) : 
      Math.min(clientValue, serverValue); 
} 

来自服务器的值是60.方法negotiatedMaxValue不会尊重客户的偏好(无法禁用心跳,也没有增加的话)。我错过了什么吗?

回答

3

你是对的。 AMQConnection将根据该方法确定心跳值,然后使用TuneOk方法将该值发送到服务器(https://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune-ok)。你可以看到它发送negotiatedMaxValue的结果()的几行,从那里你看到调用方法了下来:

_channel0.transmit(new AMQP.Connection.TuneOk.Builder() 
    .channelMax(channelMax) 
    .frameMax(frameMax) 
    .heartbeat(heartbeat) 
    .build()); 

它似乎基于代码的逻辑,你只能减少心跳,但最大的心跳将是服务器发送的任何内容,并且不能增加更多。 RabbitMQ文档对于能够增加服务器最初发送的心跳的细节有点模糊,但确实说它可以被覆盖:https://www.rabbitmq.com/heartbeats.html

我检查了最新版本的spring rabbit,它仍然具有相同的配置所以看起来不会很快改变。

检查RabbitMQ GitHub不会在设置心跳值大于服务器发送值时显示任何现有问题。也许在那里提交一个问题,看看开发者说什么? https://github.com/rabbitmq/rabbitmq-java-client/issues?utf8=%E2%9C%93&q=heartbeat