增加spring只兔子的心跳值
Increase heartbeat value in spring rabbit
我的设置遇到了一些 ,我正在尝试增加心跳间隔以测试可能的修复。
我正在使用
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
不会尊重客户端的偏好(无法禁用心跳或增加心跳)。我错过了什么吗?
你是对的。 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
我的设置遇到了一些
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
不会尊重客户端的偏好(无法禁用心跳或增加心跳)。我错过了什么吗?
你是对的。 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