2016-08-04 67 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