Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Rabbit MQ空闲连接已断开_C#_Rabbitmq_Windows2012_Heartbeat_Tcp Keepalive - Fatal编程技术网

C# Rabbit MQ空闲连接已断开

C# Rabbit MQ空闲连接已断开,c#,rabbitmq,windows2012,heartbeat,tcp-keepalive,C#,Rabbitmq,Windows2012,Heartbeat,Tcp Keepalive,我有一个.NET windows服务作为使用者/订阅者运行,它正在侦听消息队列 windows服务与安装rabbit mq server s/w的计算机在同一台计算机上运行 如果队列空闲60分钟,则会导致其连接断开(我在监视UI仪表板时知道这一点),并将windows服务置于错误状态 事实证明,解决这一问题令人沮丧。 我已经在rabbit mq客户端上应用了心跳设置,但没有效果 以下错误是我在连接断开时在日志文件中得到的 =ERROR REPORT==== 22-Aug-2017::12:20:

我有一个.NET windows服务作为使用者/订阅者运行,它正在侦听消息队列

windows服务与安装rabbit mq server s/w的计算机在同一台计算机上运行

如果队列空闲60分钟,则会导致其连接断开(我在监视UI仪表板时知道这一点),并将windows服务置于错误状态

事实证明,解决这一问题令人沮丧。 我已经在rabbit mq客户端上应用了心跳设置,但没有效果

以下错误是我在连接断开时在日志文件中得到的

=ERROR REPORT==== 22-Aug-2017::12:20:29 ===
closing AMQP connection <0.1186.0> ([FE80::C00E:F801:A2A7:8530]:61481 -> 
[FE80::C00E:F801:A2A7:8530]:5672):
missed heartbeats from client, timeout: 30s
=错误报告===2017年8月22日::12:20:29===
正在关闭AMQP连接([FE80::C00E:F801:A2A7:8530]:61481->
[FE80::C00E:F801:A2A7:8530]:5672):
错过来自客户端的心跳,超时:30秒
Rbbit mq服务器日志文件设置: [{兔子,[{心跳,60}]}

客户端代码:

var connectionFactory = new ConnectionFactory
        {
            HostName = hostName,
            UserName = userName,
            Password = password,
            RequestedHeartbeat = heartBeat,
            AutomaticRecoveryEnabled = true,
            NetworkRecoveryInterval = TimeSpan.FromSeconds(numberOfSecondsInterval),
            RequestedConnectionTimeout = RequestedConnectionTimeoutInMiliseconds
        };

        if (port > 0)
            connectionFactory.Port = port;

        var connection = connectionFactory.CreateConnection();

        var model = connection.CreateModel();

        model.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); 

        return new Tuple<IConnection, IModel>(connection, model);
var connectionFactory=新的connectionFactory
{
主机名=主机名,
用户名=用户名,
密码=密码,
RequestedHeartbeat=心跳,
AutomaticRecoveryEnabled=真,
NetworkRecoveryInterval=TimeSpan.FromSeconds(numberOfSecondsInterval),
RequestedConnectionTimeout=RequestedConnectionTimeoutInMilisions
};
如果(端口>0)
connectionFactory.Port=端口;
var connection=connectionFactory.CreateConnection();
var model=connection.CreateModel();
model.BasicQos(预取大小:0,预取计数:1,全局:false);
返回新元组(连接、模型);
上述心跳值设置为30秒

网络恢复值设置为10秒&

请求连接超时设置为2秒

我不知道在配置方面我还缺少什么

运行上述内容的服务器是Windows 2012 R2

基本上,我希望看到无论空闲时间如何,连接始终保持在原位

是否有Windows操作系统级别的TCP保持活动设置,我需要确保该设置也已就位

Rabbit MQ版本是3.6.8


在这一点上我非常恼火,因此任何指针都非常受欢迎

通过应用中引用的重新连接逻辑,我成功地阻止了RabbitMQ服务器上空闲连接的断开(60分钟后)

注意:答案已更新,说明RabbitMQ客户端的最新版本已启用自动连接恢复,因此不需要手动重新连接逻辑。这在我的情况下是不正确的,因为我已经应用了这些设置,但我仍然看到连接在60分钟空闲时间后下降。在我的场景中,客户端和服务器位于同一台机器上


如果有人知道60分钟空闲时间设置的来源,我将不胜感激,我扫描了所有rabbitmq配置设置,但找不到任何与之相关的内容。

是否有防火墙?它们似乎也会中断空闲连接。计算机上的Windows防火墙已关闭,win服务和rabbit mq服务器位于同一台计算机上。我已在win服务的连接设置中将服务器名称改为localhost,而不是计算机名称,但这没有影响。您可以尝试:使用wireshark或类似工具截取心音(您需要将rabbitmq服务器置于网络或虚拟机上)。检查问题是否仍然存在。如果是这样的话,那么您就可以知道这些心比特是否真的到达了RabbitMQ服务器。也许你的应用程序真的因为某种原因停止了发送它们。另一件事:无论如何,您都需要实现重新连接逻辑,您不应该永远相信连接在那里,因为您的客户机和服务器可以彼此分区。看起来您的代码是.NET,您可以查看EasyNetQ或MassTransitthanks Alex,重新连接逻辑似乎是解决此问题的方法,因为所有其他配置都无法解决此问题