因此,在使用PoolingHttpClientConnectionManager时,我似乎遇到了与DNS主机名解析缓存相关的问题。我有一个api,可以拨打外面的服务电话。此服务使用Akamai边缘缓存,因此可以更改IP地址。这个api负载很重。我为池大小设置了100个最大连接,空闲超时线程在空闲30秒后关闭空闲连接。但由于交通拥挤,我不认为连接是空闲的。因此,如果此服务主机的IP地址发生更改,我的应用程序似乎永远不会接收该更改,因为池中的所有连接都保留了旧的DNS解析的IP地址。
我已经通过更改我的mac上的/ etc / hosts文件(以及刷新操作系统缓存)在本地测试了这个假设。只要我的API应用程序有稳定的流量,即使在java.security中设置了5秒的TTL,它也永远不会接收到更改。我让它在更改主机名后运行20分钟,指向一个无效的IP地址,这会导致调用失败,并且它永远不会失败。我停止了发送它的JMeter流量,等待大约30秒并手动点击它,并且呼叫失败,告诉我它接收了更改。
有什么想法吗?我是否需要停止使用连接池?或者写我自己的DnsResolver(不确定它应该如何工作)?如果此条目的DNS条目发生更改,如何确保连接池中的连接将更新?
答案 0 :(得分:2)
所以我以某种方式忽略了PoolingHttpClientConnectionManager的一个构造函数,该构造函数接受TimeToLive值。这似乎为每个创建的连接设置了到期时间。我测试了它,它确实在我的本地主机文件中获取此TTL值之后的更改。我只是不知道这是否是解决问题的正确方法。如果我没有听说其他选项,我会认为这是我的问题的正确答案。