首先,关于 AMQP idle-timeout 的一些一般信息:
我想你可能对 idle_timeout 应该做什么有误解(这个名字可能有点误导)。
此设置旨在检测您连接的对等方已停止响应,即使它仍在套接字级别连接。使用的超时值应该由您希望等待多长时间来检测您的对等方不再响应您来设置。
它的作用是要求您连接的对等方在 idle_timeout 期间内至少发送 1 个 AMQP 帧。如果由于消息传输等原因没有发送帧,那么它应该发送一个空帧。通常,对等方将在空闲超时周期的一半发送这些保持活动或心跳帧,以确保网络条件不会导致虚假超时。
同样重要的是要知道通信的每一半都有自己的空闲超时值。也就是说,从客户端到代理的通信将具有与另一个方向的通信不同的空闲超时值。
现在来看看你的具体问题:
我使用的是 Qpid Proron 0.18.1 版本。idle_timeout 打印为 connection.idle_timeout() : 15000。我无法追溯到设置默认值 15000 的代码。
您在这里看到的是连接另一端设置的 idle_timeout 值。它告诉质子实现每 15 秒至少发送 1 帧,否则它将认为连接超时。这发生在您不必在您正在使用的 C++ 实现中做任何事情的情况下。
c.connect(conn_url, co.idle_timeout(proton::duration::FOREVER));
这使经纪人在一分钟后超时。
这里的代码实际上是告诉代理永远不要发送任何保持活动的帧 - 实际上与根本不设置属性相同,因为默认情况下不发送帧。
我很确定这不会使代理超时-正如我上面解释的那样,它为此设置了错误的空闲超时方向。我猜它有一个完全独立的配置,因为你在一分钟内没有做任何事情并且它想要节省资源,所以它会让你超时 - 我似乎记得 Azure Servicebus 会这样做。
c.connect(conn_url, co.idle_timeout(proton::duration::SECOND));
根本没有让代理超时,即使我认为这应该在代理空闲一秒钟后超时。
这是告诉代理每秒至少发送一个帧,而不是告诉代理如果一秒钟内没有任何反应就断开连接。如果您使用与以前相同的代理,我不确定为什么它不会在同一分钟后超时,但无论如何,只有在代理发生不好的情况下才会超时。