增加春兔的心跳值

时间:2016-08-04 16:27:53

标签: java spring-boot rabbitmq spring-rabbitmq

我正面临一些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不会尊重客户端的首选项(不能禁用心跳也不能增加心跳)。我错过了什么吗?

1 个答案:

答案 0 :(得分: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